此Java代码中有多少对象符合垃圾收集的条件?

时间:2016-03-18 12:00:30

标签: java collections garbage-collection garbage

根据我正在阅读的书,这里的答案显然是2,但我仍然不明白为什么。它表示在行“// do stuff”之后,2个对象将符合GC的条件。

有人可以一步一步向我解释一下吗?在代码中的某一行之后知道有多少对象符合垃圾收集的条件是否有诀窍?因为我们被告知这些问题(有多少人可以使用gc)将出现在测试中。

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 
   } 
}

是的,答案是“ 2个对象将在”//做东西“之后用于垃圾收集,但我仍然不明白为什么。

在这张图片中,它还说明为什么答案是2,但解释只是让我更加困惑。

Image from the SCJP book we're told to read.

它甚至没有解释其他物体发生了什么。

编辑:

所以根据你们的说法,C1和C3都符合GC的条件,我可以看到为什么因为C1已经设置为null而C1.GO(C2)将null返回给C3。

但是根据这本书,它只有C1符合条件,答案是2,因为Short包装器。我不知道为什么会这样,甚至是Short包装器对象。

3 个答案:

答案 0 :(得分:1)

我已经运行并调试了代码,我可以看到c1和c3为空(由于显而易见的原因),并且c2和c3是!= null。

那是因为Java中的对象是按值(explanation)传递的,并且在方法中设置c2 = null并不会导致原始c2被设置为空。

答案 1 :(得分:0)

c2仍在引用纸板对象。当我们调用c1.go(c2)时,c1被设置为null并且c3引用了null。 因此,它们都是(c1和c3)不再在内存中引用,并且有资格进行垃圾回收。

答案 2 :(得分:0)

我认为正确答案实际上只有一个对象符合“// do stuff”行后的垃圾收集条件。

在该代码中,只创建了2个对象,然后c1和c2引用它们。在行“c1 = null;”之后一个对象立即有资格获得GC,但第二个对象仍然可以通过c2 ref。

访问

更新:

我错过了一个细节 - 每次调用new CardBoard()都会创建两个对象,因此调用c1 = null会使符合条件的CardBoard和他的嵌套Short成员用于GC