1

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

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

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

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

我的想法是:

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

在相关 Game 对象使用的每个对象中:删除(无效?)对相关 Game 对象的引用。

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

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

4

3 回答 3

2

这就足够了:

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

如果游戏不是从应用程序的根目录引用的,那么它可以被垃圾收集,它引用的所有对象也可以被垃圾回收(不管它们是否引用了游戏,因为整个对象图仍然不是可从任何地方到达)。

于 2013-11-06T21:04:59.177 回答
1

您需要做的就是删除GameServer. 即使Game有对其他对象和这些对象的Game引用(形成循环/循环引用),它们仍然无法从 GC 根访问,因此无论如何最终都会被垃圾收集。

于 2013-11-06T21:05:20.293 回答
0

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

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

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

但是,唯一需要将字段设置为空的情况是,如果您怀疑垃圾收集器落后并且无法及时获取对象。这有点罕见。

于 2013-11-06T21:04:48.440 回答