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]
我的答案是
被回收。
至于有争议的
不会被回收。
因为,它被Alpha的静态类成员变量引用着。
mark