class Beta { }
class Alpha {
static Beta b1 ;
Beta b2;
}
public class Tester {
public static void main(String[] args) {
Beta b1 = new Beta();
Beta b2 = new Beta();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
a1.b1 = b1 ;
a1.b2 = b1 ;
a2.b2 = b2 ;
a1 = null ;
b1 = null;
b2 = null;
System.out.println(" Line 1 " + " a1 " + a1.b1);
System.out.println(" Line 2 " + " a1 " + a1.b2);
System.out.println(" Line 3 " + " a2 " + a2.b2);
System.out.println(" Line 4 " + " a1 " + a2.b1);
System.out.println(" Line 5 " + " b1 " + b1);
System.out.println(" Line 6 " + " b1 " + b2);
}
}
我不确定为什么上述程序中只有a1对象可用于垃圾回收。我期望a1,b1和b2由垃圾收集器收集。
如您所见,将a1,b1和b2设为NULL,因此这使对象可用于垃圾回收。如果object为NULL或任何线程或引用变量无法访问,则应由垃圾回收器对其进行收集。
有人可以通过良好的示例和更精确的方式帮助我理解上述程序的精妙之处吗?感谢您的帮助。
最佳答案
因为由于下面的行,仍然存在对b1和b2引用所指向的对象的引用。
a1.b1 = b1 ;
a1.b2 = b1 ;
a2.b2 = b2 ;
假设这样:
b1--->BetaObj1
b2---BetaObj2
a1---> AlphaObj1
a2---> AlphaObj2
a1.b1指向b1,这意味着已引用BetaObj1
a1.b2指向b1,这意味着还有对BetaObj1的引用
(目前有3个对BetaObj1的引用)
a2.b2指向b2,这意味着引用了BetaOBj2
(目前有2个对BetaObj2的引用)
a1=null;
使AlphaObj1有资格获得GCb1=null;
使BetaObj1引用计数为2,因此该对象不适合使用GCb2=null;
使BetaObj2引用计数为1,因此该对象不适合使用GC。