Garbage Collection问题

class Beta {}  
class Alpha {  
static Beta b1;  
Beta b2;  
}  
public class Tester {  
public static void main(String [] args){  
Beta bt1 = new Beta();        Beta bt2 = new Beta();  
Alpha at1 = new Alpha();     Alpha at2 = new Alpha();  
at1.b1 = b1;  
at1.b2 = b1;  
at2.b2 = b2;  
at1 = null;  bt1 = null;  bt2 = null;   
  //do stuff  
}

请问到了第14行有哪些对象有资格被GC搜集?

 

多谢指点!

总结下,希望这次不要再有错误了,哈。

[code="java"]
class Beta {
}

class Alpha {
static Beta b1;
Beta b2;
}

public class Tester {
public static void main(String[] args) {
Beta bt1 = new Beta();
Beta bt2 = new Beta();
Alpha at1 = new Alpha();
Alpha at2 = new Alpha();
at1.b1 = bt1;
at1.b2 = bt1;
at2.b2 = bt2;
at1 = null;
bt1 = null;
bt2 = null;
// do stuff
}
}[/code]

问:在第21行,有哪些实例将会被GC回收?
答:

  • 18行的at1 = null,会导致13行创建的实例将会被回收。
    因为再没有对这个实例的引用。

  • 19行的bt1 = null,不会导致11行创建的实例被回收。
    因为11行的实例仍然被Alpha这个类的静态变量引用着。
    (该静态变量生活在Alpha的Class的实例中,该实例直到Alpha类被jvm卸载——基本上永远不会发生——时才会消失。网上有根据编译后的class中分析出,静态变量和常量放在一起的。)

  • 20行的bt2 = null,不会导致12行创建的实例被回收。
    因为at2的b2仍然保持对该实例的引用。

[code="java"]at1; bt1; bt2 被GC释放[/code]

你的代码有误,我修改下,如下。
[code="java"]
class Beta {
}

class Alpha {
static Beta b1;
Beta b2;
}

public class Tester {
public static void main(String[] args) {
Beta bt1 = new Beta();
Beta bt2 = new Beta();
Alpha at1 = new Alpha();
Alpha at2 = new Alpha();
at1.b1 = bt1;
at1.b2 = bt1;
at2.b2 = bt2;
at1 = null;
bt1 = null;
bt2 = null;
// do stuff
}
}
[/code]

我的答案是

  • 第13行创建的Alpha
  • 第12行创建的Beta

被回收。

至于有争议的

  • 第11行创建的Beta

不会被回收。

因为,它被Alpha的静态类成员变量引用着。

mark