如何确保这些对象被垃圾收集?

时间:2013-11-06 21:00:35

标签: java multithreading garbage-collection

我目前正在为在线游戏编写一个小型服务器。它创建了一个“服务器”对象,用于处理连接和数据传输,以及两个玩家之间每个创建的游戏会话中的一个“游戏”对象。

“Game”类扩展了“Thread”,在它的run()方法中有一个无限循环。

每个“游戏”对象都包含对其他几个对象(板上的棋子,也就是说)的引用,并且这些对象本身包含对相应“游戏”对象的引用,因为它们需要相互通信定期。

现在,当游戏结束并且不再需要“游戏”对象时 - 我必须采取哪些步骤来确保“游戏”对象被垃圾收集?

我的想法是:

在“服务器”对象中:删除对相关游戏对象的引用。

在有问题的Game对象使用的每个对象中:删除(nullify?)对相关Game对象的引用。

打破运行Game对象的run()方法的无限循环。

这是否足够,或者是否需要其他步骤,或者这些步骤中的某些步骤是不必要的?

3 个答案:

答案 0 :(得分:2)

这就足够了:

  

在“服务器”对象中:删除对游戏对象的引用   问题

如果游戏没有从应用程序的根目录中引用,那么它可以被垃圾收集,并且它所引用的所有对象也是如此(无论它们引用游戏还是没关系,因为这整个对象图仍然无法从任何地方到达。

答案 1 :(得分:1)

您需要做的就是删除Game中对Server对象的引用。即使Game引用了其他对象和那些Game对象(形成循环/循环引用),它们仍然无法从GC根目录到达,因此无论如何最终都会被垃圾收集。

答案 2 :(得分:0)

  

现在,当游戏结束并且不再需要“游戏”对象时 - 我必须采取哪些步骤来确保“游戏”对象被垃圾收集?

因此,如果您的应用程序确实没有对相关对象的任何引用,那么垃圾收集器将释放它们。 Game线程应该完成(即run()方法应该返回),因此{1}}将被收获。然后,Thread对象帮助的任何对象将使其引用计数器递减,从而允许它们被释放。

也就是说,如果你有大量的对象带宽,可以通过将Game对象中的字段设置为null来专门删除所有权对象中的引用来帮助GC。例如,对于因GC周期而言非常敏感的Android应用程序尤其如此,因为许多旧的移动设备都是单核。

但是,如果您怀疑垃圾收集器落后并且无法及时收到对象,那么您应该将字段专门设置为null的唯一时间。这有点罕见。