哪些对象符合GC条件?

chr*_*cal 4 java garbage-collection

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);
     System.out.println("c3 value : "+c3);
     c1 = null;
     System.out.println("c1 value : "+c1);
     System.out.println("c2 value : "+c2);
    // do Stuff
  } 
}
Run Code Online (Sandbox Code Playgroud)

这是SCJP6模拟考试的一个例子.问题是:当达到// doStuff时,有多少对象符合GC条件?答案是(2个对象),因为:只有一个CardBoard对象(c1)符合条件,但它有一个相关的Short包装器对象也符合条件.

当我执行代码时,看起来c3也指向null ...所以我会说3个对象符合GC的条件.

有人可以指导我完成这段代码的逻辑.

Vin*_*lds 10

该对象c3最初为null,因此不存在重新收集它的问题,因为它从未存在过.垃圾收集器旨在清除堆上实际存在的对象.

其余的,引用c2永远不会丢弃,因此不会被回收.尽管在语句中c2似乎无效,但CardBoard c3 = c1.go(c2);事实并非如此.引用c2已经通过值传递,虽然引用无效,但是在main方法中存在对该对象的现有引用.因此它不会被收回.

这留给我们c1,已经明确无效,因此有资格收集.但是,c1还包含对Short变量故事的引用,该变量故事没有来自任何其他对象的任何入站引用.这导致两个对象符合清理条件 - 一个CardBoard对象和嵌入的Short对象.