在我学习OCJP的过程中,我遇到了以下问题:
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}}当达到//doStuff时,有多少对象符合GC条件?
正确答案是2,即c1及其story对象。
当到达//doStuff行时,c3也为null。为什么它不符合GC的条件?
发布于 2012-10-28 22:38:21
c3是一个具有空引用的本地句柄,它不指向(并且hever已经指向)已分配的对象。因此,GC不存在任何问题。
发布于 2012-10-28 22:38:19
c3不是对象。它是一个引用null的变量。变量不能符合GC的条件。只有对象才有资格进行GC。
发布于 2012-10-28 22:43:04
垃圾收集器扫描内存中的对象,当它找到一个对象时,检查指向它的句柄(反之亦然),当调用垃圾收集器时,没有指向它们的句柄的对象(在内存中)将从内存中删除。在这种情况下,代码中只有2个对象在内存中创建,但有3个句柄。垃圾回收器最多只能删除2个对象(因为只存在两个对象) C3仅指向空位置。不会删除C1、C2和C3。它们用来指向的对象将被移除(以防没有其他句柄点指向它们)。因此,在这一点上,由于C3从未指向内存中的对象,因此将其设置为null对垃圾收集器没有影响。
希望我能帮上忙
https://stackoverflow.com/questions/13109717
复制相似问题