【发布时间】:2013-11-23 02:36:57
【问题描述】:
对于如何利用 Java 的垃圾收集来处理不再使用的对象实例,我有点困惑。我有几个问题:
在我的游戏中,我生成了大炮而不将它们存储在如下变量中:
new Cannon("down", tileX, tileY, 65);
这个对象是否总是有资格进行垃圾回收?如果是,那么它什么时候会真正被处理掉?
==
对于我的 Cannon 类,我在创建时将所有实例添加到静态数组列表中。这是我第一次尝试使用垃圾回收:
ArrayList<Cannon> cannonList = Cannon.getCannons();
for (int i = 0; i < cannonList.size(); i++) {
Cannon c = (Cannon) cannonList.get(i);
c = null;
}
for (int i = 0; i < cannonList.size(); i++) {
cannonList.remove(i);
}
System.gc();
当我设置“c = null;”时,它是否使原始 Cannon 为“null”,从而使其有资格进行垃圾收集,或者它是否对对象进行新的引用 c,然后将其设置为 null,让它对我没有任何作用?
==
我的 Cannon 类不断创建 EnemyProjectile 类的实例。 EnemyProjectiles 类包含一个名为“可见”的布尔字段。当“可见”等于 false 时,处置我的 EnemyProjectile 类并使其符合垃圾收集条件的正确方法是什么?
【问题讨论】:
-
一个对象在不再有任何引用后被回收一段时间。基本方案是“标记和扫描”,其中程序首先“遍历”对象 A 指向对象 B 指向对象 C 的整个“树”……,“标记”每个到达的对象。然后检查所有对象,并回收那些未标记为可达的对象。
-
“它是否对对象创建一个新的引用 c,然后将其设置为 null,让它对我什么都不做?” 是的,它对你没有任何作用。从列表中删除一个项目并且(可能)不再引用它是使其符合 GC 条件的原因。