计算符合GC条件的对象数量

时间:2013-01-12 18:49:54

标签: java garbage-collection scjp

晚上好,请查看此代码示例,其中显示了符合GC条件的对象数量:

public class CardBoard {

Short story = 5;

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

   }
}

我看到有四个对象符合GC的条件,当达到了那个c3并且它是关联的故事对象和c1以及它的相关故事对象时,你看到了什么?

1 个答案:

答案 0 :(得分:8)

1 对象有资格使用GC - 之前由c1引用的对象。 c3指向nullCardBoard.go()始终返回null)。

还要记住,c1c2变量只是引用,而不是对象。因此,它们不需要被垃圾收集。他们生活在堆栈上,而不是堆在堆上。

最后不要被愚弄:

CardBoard go(CardBoard cb) {
  cb = null;
  return cb;
}

这只会使cb引用(参数)无效,而不是c2引用。


Short story = 5;

是一个单独的陷阱。如果它是short story则它不会被视为单独的对象。但Short是一个对象,因此技术上CardBoard指向另一个符合GC条件的对象。然而!由于原始包装器缓存5实际上是Short静态缓存的一部分,并且从来没有真正符合GC的条件。换句话说,代表Short的{​​{1}}类型的对象始终由5中的static缓存引用。

这是最好的部分。如果是:

Short

那么答案就是...... 2 。这是因为Short story = 5000; 始终返回Short.valueOf((short)5000)的新实例(符合GC条件),而Short始终返回相同的实例。

哇,这太棘手了!