这个问题来自SCJP。我们需要找到有资格进行垃圾收集的对象。答案是c3和短篇小说。我需要知道,为什么它的短篇小说有资格获得GC。这实际上是一个实例变量。这是不是意味着,如果我不使用我的实例变量,它们有资格进行垃圾收集?
按照书籍的实际答案是:只有一个CardBoard对象(c1)符合条件,但它有一个相关的Short包装器对象也符合条件。所以“两个”对象是合格的。
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
}
}
答案 0 :(得分:3)
这一切都归结为垃圾收集器认为“可达”的内容。基本上,它从所谓的垃圾收集根开始(执行线程中的局部变量是这种根的一个例子),并遵循对其他对象的所有引用。在访问了所有这些引用后可以访问的所有对象之后,还有一些不再可以访问的对象,这意味着无论你怎么努力,你都不会再使用这些对象,因此可以安全地丢弃它们(或收集为垃圾)。
虽然c1
引用了其story
个对象,但无法联系任何一个,因此它们都符合条件。
c3
从不引用一个对象,该示例旨在混淆,但go()
总是返回空引用,并且没有为c3
创建任何对象实例,并且它也没有挂起在c1
或c2
引用的任一对象上(尽管后者与此案例无关,因为它仍由c2
变量引用)。
答案 1 :(得分:1)
如果没有任何内容引用c1
,那么Short story = 200;
字段(属于c1
实例)也有资格收集。
答案 2 :(得分:0)
答案并未说c3
它表示c1
,因此它包含Short story
。这是由于行
c1 = null;
此时c1
引用的对象可以是GCed,因此也可以是它引用的任何对象。