powerwind 发表于 2006-5-3 23:21

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的回收机制工作,最多只能建议,就算它工作了也不一定会回收到那些不用的对象.

hjack 发表于 2006-5-4 12:58

我的理解是:
A a=new A();
B b=new B();
是在堆里分配了两个对象,并在栈里有两个变量指向这两个对象,


a=null;
b=null;
的时候,在栈里就没有变量再引用这两个对象了,也就是说这两个对象变成了从根集任何路径都不可达的对象,这应该符合回收条件了.

不知这样理解对不对,欢迎讨论.

深圳情缘 发表于 2006-5-4 13:24

可是......

执行
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;      
      }
}

hjack 发表于 2006-5-4 13:48

在栈里面,当a=null;b=null;后也就是说已经退出了作用域,从栈里是不可达这两个对象了。

powerwind 发表于 2006-5-4 15:11

我也觉得应该把它们回收,可是不知道JAVA的回收机制够不够聪明?它能够判断从栈里可不可到达某个对象了?
如果把a或b其中之一不设置为null,可以肯定不会给回收.如果只把b=null,那么可以通过a访问到b,这样a,b就都不会给回收.
那么,如果有些对象要经过很多对象的间接引用才可以达到,JAVA的回收机制岂不是很累?因为要判断一个对象是不是垃圾很麻烦啊!
也许是我对JAVA的内部机制不了解才会这样想,不知道它的工作原理怎样,可是要证明它呢,还想不出办法!
大家讨论一下,灌灌水也好!

hjack 发表于 2006-5-4 15:29

这属于java虚拟机实现方面的了,垃圾回收有很多算法,对这方面研究不是很多,呵呵。

有时间的话可以看看《java虚拟机》。

powerwind 发表于 2006-5-4 15:43

《java虚拟机》这本书以前看了一眼,看不懂,就没看下去了!
看来要硬着头皮看一下才行.

kinven0000 发表于 2006-5-4 23:10

跟版主一样,我觉得也是都要回收的。
垃圾回收器会从对象开始时建立一个根对象的集合,如果可以到达的对象就不会回收,如果到达不了的就回收了。

wool王 发表于 2006-5-7 19:50

同意二楼...
页: [1]
查看完整版本: java回收机制的一点疑问