被隔绝的对象垃圾收集海岛

时间:2011-07-28 07:41:32

标签: java garbage-collection

我不明白“孤立物体群岛”的含义

class X2{  
    public X2 x; 

    public static void main(String... args){  
        X2 x2 = new  X2();  
        X2 x3 = new  X2();  
        x2.x = x3;  
        x3.x = x2;  
        x2 = new X2();  
        x3 = x2;  
        doComplexStuff();  
    }  
}

第9行运行后,有多少对象可以用于垃圾回收? 起初我没想到。但答案是两个。例如x2.x和x3.x会发生什么?它们也是物体,不是吗?说实话,我不明白这个K& B问题。

2 个答案:

答案 0 :(得分:4)

在示例中,您将创建总共3个对象(在第4,5和8行)。我将分别称它们为o1,o2和o3。 o1由x2引用,o2由x3引用。它们还包含对彼此的引用(o1.x = x2.x引用o2,o2.x = x3.x引用o1)。当执行第8行时,x2不再引用o1,但仍然由o2.x = x3.x引用。当执行第9行时,o3不再被x3引用,但仍由o1.x引用。

此时o1和o2仍然相互引用。但是没有其他对这些对象的引用,因此无法使用它们。因此,它们有资格进行垃圾收集。

答案 1 :(得分:2)

如果垃圾收集基于规则

  

有没有人提到我?

然后x2指的是x3而x3指的是x2,所以两者都被引用,所以它们不会被垃圾收集。

然而,垃圾收集规则比这更明确。 x2和x3是一个小“岛”,一旦我们离开声明它们的范围,其他任何对象都没有引用它们。所以整个“岛”都无法到达,所以全岛都是垃圾收集。