java回收机制的一点疑问
JAVA的回收机制会回收所有不再被引用变量指向的对象,但是下面的情况呢?class A
{
B b;
void setB(B b)
{
this.b=b;
}
}
class B
{
A a;
void setA(A a)
{
this.a=a;
}
}
class MyTest
{
public static void main(String[]args)
{
A a=new A();
B b=new B();
a.setB(b);
b.setA(a);
a=null;
b=null;
}
}
我本来想自己写个测试的,可是一想,我们无法确定JAVA的回收机制工作,最多只能建议,就算它工作了也不一定会回收到那些不用的对象. 我的理解是:
A a=new A();
B b=new B();
是在堆里分配了两个对象,并在栈里有两个变量指向这两个对象,
当
a=null;
b=null;
的时候,在栈里就没有变量再引用这两个对象了,也就是说这两个对象变成了从根集任何路径都不可达的对象,这应该符合回收条件了.
不知这样理解对不对,欢迎讨论.
可是......
执行a.setB(b);
b.setA(a);
后,
又有两个引用分别指向了这两个对象了,这时这两个对象分别有两个引用指向他们
也就是说
当
a=null;
b=null;后,
这时候这两个对象就分别剩下两个引用指向他们了。
可能改成这样比较好理解些
class A
{
B bb;
{
void setB(B b)
{
this.bb=b;
}
}
class B
{
A aa;
void setA(A a)
{
this.aa=a;
}
}
public class ClassTest
{
public static void main(String[]args)
{
A a=new A();
B b=new B();
a.setB(b);
b.setA(a);
a=null;
b=null;
}
} 在栈里面,当a=null;b=null;后也就是说已经退出了作用域,从栈里是不可达这两个对象了。 我也觉得应该把它们回收,可是不知道JAVA的回收机制够不够聪明?它能够判断从栈里可不可到达某个对象了?
如果把a或b其中之一不设置为null,可以肯定不会给回收.如果只把b=null,那么可以通过a访问到b,这样a,b就都不会给回收.
那么,如果有些对象要经过很多对象的间接引用才可以达到,JAVA的回收机制岂不是很累?因为要判断一个对象是不是垃圾很麻烦啊!
也许是我对JAVA的内部机制不了解才会这样想,不知道它的工作原理怎样,可是要证明它呢,还想不出办法!
大家讨论一下,灌灌水也好! 这属于java虚拟机实现方面的了,垃圾回收有很多算法,对这方面研究不是很多,呵呵。
有时间的话可以看看《java虚拟机》。 《java虚拟机》这本书以前看了一眼,看不懂,就没看下去了!
看来要硬着头皮看一下才行. 跟版主一样,我觉得也是都要回收的。
垃圾回收器会从对象开始时建立一个根对象的集合,如果可以到达的对象就不会回收,如果到达不了的就回收了。 同意二楼...
页:
[1]