为什么包装器对象有资格进行垃圾回收?

时间:2013-12-19 00:07:29

标签: java

这个问题来自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
    }
}

3 个答案:

答案 0 :(得分:3)

这一切都归结为垃圾收集器认为“可达”的内容。基本上,它从所谓的垃圾收集根开始(执行线程中的局部变量是这种根的一个例子),并遵循对其他对象的所有引用。在访问了所有这些引用后可以访问的所有对象之后,还有一些不再可以访问的对象,这意味着无论你怎么努力,你都不会再使用这些对象,因此可以安全地丢弃它们(或收集为垃圾)。

虽然c1引用了其story个对象,但无法联系任何一个,因此它们都符合条件。

c3从不引用一个对象,该示例旨在混淆,但go()总是返回空引用,并且没有为c3创建任何对象实例,并且它也没有挂起在c1c2引用的任一对象上(尽管后者与此案例无关,因为它仍由c2变量引用)。

答案 1 :(得分:1)

如果没有任何内容引用c1,那么Short story = 200;字段(属于c1实例)也有资格收集。

答案 2 :(得分:0)

答案并未说c3它表示c1,因此它包含Short story。这是由于行

c1 = null;

此时c1引用的对象可以是GCed,因此也可以是它引用的任何对象。