Java 孤立对象的垃圾收集岛
我不明白“孤岛”的意思 第9行运行后,有多少对象可用于垃圾收集?Java 孤立对象的垃圾收集岛,java,garbage-collection,Java,Garbage Collection,我不明白“孤岛”的意思 第9行运行后,有多少对象可用于垃圾收集? 起初我认为没有。但答案是两个。例如,x2.x和x3.x会发生什么?它们也是物体,不是吗?老实说,我不明白这个K&B问题。如果垃圾收集是基于规则的话 有人提到过我吗 然后x2指的是x3,x3指的是x2,所以两者都被引用,所以它们不会被垃圾收集 然而,垃圾收集规则比这更聪明。x2和x3是一个小“孤岛”,一旦我们离开声明它们的范围,就没有其他对象引用它们了。所以整个“岛”无法到达,所以整个岛被垃圾收集。在本例中,您总共创建了3个对象(第
起初我认为没有。但答案是两个。例如,x2.x和x3.x会发生什么?它们也是物体,不是吗?老实说,我不明白这个K&B问题。如果垃圾收集是基于规则的话 有人提到过我吗 然后x2指的是x3,x3指的是x2,所以两者都被引用,所以它们不会被垃圾收集
然而,垃圾收集规则比这更聪明。x2和x3是一个小“孤岛”,一旦我们离开声明它们的范围,就没有其他对象引用它们了。所以整个“岛”无法到达,所以整个岛被垃圾收集。在本例中,您总共创建了3个对象(第4、5和8行)。我将分别称它们为o1、o2和o3。o1由x2引用,o2由x3引用。它们还包含相互引用(o1.x=x2.x引用o2,o2.x=x3.x引用o1)。当执行第8行时,o1不再被x2引用,但仍然被o2.x=x3.x引用。执行第9行时,x3不再引用o2,但o1.x仍然引用o2 此时,o1和o2仍然相互参照。但是,没有对这些对象的其他引用,因此无法使用它们。因此,它们有资格进行垃圾收集
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();
}
}