工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2238|回复: 8

java回收机制的一点疑问

[复制链接]
发表于 2006-5-3 23:21 | 显示全部楼层 |阅读模式
JAVA的回收机制会回收所有不再被引用变量指向的对象,但是下面的情况呢?

  1. class A
  2. {
  3.         B b;
  4.         void setB(B b)
  5.         {
  6.                 this.b=b;
  7.         }
  8. }

  9. class B
  10. {
  11.         A a;
  12.         void setA(A a)
  13.         {
  14.                 this.a=a;
  15.         }
  16. }

  17. class MyTest
  18. {
  19.         public static void main(String[]args)
  20.         {
  21.                 A a=new A();
  22.                 B b=new B();
  23.                 a.setB(b);
  24.                 b.setA(a);
  25.                 a=null;
  26.                 b=null;       
  27.         }
  28. }
复制代码

我本来想自己写个测试的,可是一想,我们无法确定JAVA的回收机制工作,最多只能建议,就算它工作了也不一定会回收到那些不用的对象.
发表于 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;      
        }
}
回复

使用道具 举报

发表于 2006-5-4 13:48 | 显示全部楼层
在栈里面,当a=null;b=null;后也就是说已经退出了作用域,从栈里是不可达这两个对象了。
回复

使用道具 举报

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

使用道具 举报

发表于 2006-5-4 15:29 | 显示全部楼层
这属于java虚拟机实现方面的了,垃圾回收有很多算法,对这方面研究不是很多,呵呵。

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

使用道具 举报

 楼主| 发表于 2006-5-4 15:43 | 显示全部楼层
《java虚拟机》这本书以前看了一眼,看不懂,就没看下去了!
看来要硬着头皮看一下才行.
回复

使用道具 举报

发表于 2006-5-4 23:10 | 显示全部楼层
跟版主一样,我觉得也是都要回收的。
垃圾回收器会从对象开始时建立一个根对象的集合,如果可以到达的对象就不会回收,如果到达不了的就回收了。
回复

使用道具 举报

发表于 2006-5-7 19:50 | 显示全部楼层
同意二楼...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-13 07:20

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表