2016-01-14 18 views
2

让我们说我有一个国际象棋网站。人们登录并与其他人下棋,我的Java程序正在进行所有计算。我看只有两个我会怎么做选择:正在移除对象的引用足以不会导致内存泄漏?

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

  • 运行Java程序的一个实例,但每创建一个新游戏时创建一个新的Board()和两个Player。但在这种情况下,我需要关注内存泄漏,因为我永远不会终止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; 

我已经完成了任务?如果是的话,我是否以一种好的方式做到了,或者这是令人难以置信的令人难以置信的恶心?

+2

删除对象的所有*(实时)引用足以避免内存泄漏。我们没有看到这些对象在'startMatch'(或更高版本)内发生了什么。如果他们藏在某个地方,他们可能会活得很好。 – Thilo

回答

2

这是足够的值(或实例)走出去的范围(一旦无法访问他们符合垃圾收集),有无需明确null您参考(除非实例(S)包含它们将永远不会超出范围)。

+0

同意,无论如何将事情设置为'null'即将超出范围是无用的混乱。如果您希望在变量超出范围之前收集它们,您可能希望将它们设置为“null”(但在这种情况下,您应该重新考虑变量范围)。 – Thilo

+0

我会如何让他们超出范围? – Gendarme

+0

@Thilo如果您将它们归为空白,它们就有资格收集,并不一定收集。 –