Java 删除对对象的引用是否足以避免内存泄漏?

Java 删除对对象的引用是否足以避免内存泄漏?,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,假设我有一个国际象棋网站。人们登录并与其他人下棋,我的Java程序正在进行所有计算。我只看到了两种选择: 为每个国际象棋游戏运行一个新的Java程序“实例”。这意味着每次新的国际象棋游戏开始时,我都会在终端中编写java国际象棋 运行Java程序的一个实例,但每次启动新游戏时,使用两个玩家创建一个新的Board()。但是在这种情况下,我需要注意内存泄漏,因为我永远不会终止Java程序 我认为第一种选择是错误的。这个假设并不是基于任何知识,所以我很可能是错的。但为了这篇文章,我选择了第二种选择

假设我有一个国际象棋网站。人们登录并与其他人下棋,我的Java程序正在进行所有计算。我只看到了两种选择:

  • 为每个国际象棋游戏运行一个新的Java程序“实例”。这意味着每次新的国际象棋游戏开始时,我都会在终端中编写
    java国际象棋

  • 运行Java程序的一个实例,但每次启动新游戏时,使用两个玩家创建一个新的
    Board()
    。但是在这种情况下,我需要注意内存泄漏,因为我永远不会终止Java程序

我认为第一种选择是错误的。这个假设并不是基于任何知识,所以我很可能是错的。但为了这篇文章,我选择了第二种选择。如果我错了,让我知道

使用第二个选项,每次开始新的国际象棋游戏时,我都可以这样做:

Player p1 = new Player(white);
Player p2 = new Player(black);
Board b1 = new Board(p1,p2);
startMatch(b1);
游戏结束后,这三个对象不再需要,应该从内存中删除。我听说Java垃圾收集器收集所有无法访问的对象

因此,如果我这样做:

p1 = null;
p2 = null;
b1 = null;

我完成任务了吗?如果是,我是否以一种好的方式完成了它,或者这是一种令人难以置信的畏缩,值得和厌恶吗?

值(或实例)超出范围就足够了(一旦无法访问,它们就有资格进行垃圾收集),没有必要显式地
null
引用(除非实例)包含它们永远不会超出范围)。

同意,将无论如何都将超出范围的内容设置为
null
,这是无用的。如果希望在变量超出范围之前收集它们,您可能需要将它们设置为
null
(但在这种情况下,您可能应该重新考虑变量范围)。我如何使它们超出范围?如果将它们设为null,它们就有资格被收集,他们不一定是被收集的。@宪兵你怎么把他们放在范围内?这可能是会话中的一个实例?将其从会话中删除。“不一定收集”。对。你真的不能(或应该)做什么来强制实际收集。您可以做的最好的事情是取消引用,使它们符合收集条件(即告诉JVM,如果它觉得需要更多内存,它可以清理它们)。删除对对象的所有(活动)引用就足以避免内存泄漏。我们看不到这些对象在
startMatch
(或更高版本)内部发生了什么。如果把它们藏在某个地方,它们很可能还活着。