【发布时间】:2012-03-07 20:37:53
【问题描述】:
class A{
A aob;
public static void main(String args[]){
A a=new A();
A b=new A();
A c=new A();
a.aob=b;
b.aob=a;
c.aob=a.aob;
A d=new A().aob=new A(); //tricky assignement
c=b; //one object eligible GC
c.aob=null;
System.gc();
}
}
有两个对象符合垃圾回收条件,但一个很难理解。
A d=new A().aob=new A();
1) 这条线我认为它会变成这样
A d = new A().aob = new A();
^ ^
O1 O2
O1 --> O2 --> null
^
|
d ----|
2) 但真正在做的是这个(所以一个合格的对象)为什么会这样?
A d = new A().aob = new A();
^ ^
O1 O2
O1 --> O2 --> null
^
|
d -----------|
因为分配是从右到左关联的。
A d = ( new A().aob = new A() );
谁能解释一下? 谢谢
【问题讨论】:
-
两点:第一,你的第二张图应该有
O2 --> O1 --> null。其次,另一个符合gc条件的对象是A c = new A();中分配给c的A的原始实例。大概你知道这个,但没有提到它,所以我想我会提到它。 :)
标签: java garbage-collection scjp ocpjp