日期:2014-05-20  浏览次数:20815 次

关于JAVA GC垃圾回收机制的疑问
对象A中有两个B类型的成员变量 

class A{

 B b1;
 B b2;

}
A a1=new A();
A a2=new A();
  a2.b1=a1.b1
  a1=null;



这样 a1 和 a2中的b1都指向同一块内存
gc的时候,a1所占用的内存,此时a1所占用的内存b1还被引用,这样a1所占用的内存会释放掉吗。是不是只释放b2,b1不释放,还是整个a1的内存都不能释放?
GC 垃圾回收 内存泄露 内存 Java

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

我觉得不对吧,a1里面应该只有b1的引用吧?然后这个引用当然是可以销毁的
不确定

a1里面有2个成员变量,b1,b2啊。


我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?

a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。


a1里面的b1没有被a2引用着啊,这两个都是引用,指向同一个对象
------解决方案--------------------
a1 = null是会被收回的
a2.b1 = a1.b1这句话,a2.b1并不是指向a1.b1,
而是指向了a1.b1所引用的内存地址(此内存取名为C),相当于此时a1.b1和a2.b1都引用了C,
a1 = null后,a1.b1对C的引用不存在了,而a2.b1此时终于媳妇熬成婆,可以独享C了。
------解决方案--------------------
gc的时候是有向图搜索,从静态变量,或者活跃线程的临时变量开始搜索,搜索不到的都可以回收。
a2不能被回收,a2中的b1就不能回收,b1中没有引用a1,所以a1可以回收
------解决方案--------------------
a1,a2都是类型为A的对象变量,其引用的对象中分别存在b1,b2两个对象变量,如果楼主没有显示定义A的缺省构造器的话,b1,b2均无引用,都是null。假定楼主的代码中是定义了无参构造器的,那最终a2.b1指向原先的a1.b1,当a1被复制null后,a1引用的对应就可以被GC了,但是当前a2.b1引用的内存是不被GC的。也就是说a1引用的对象并没有完全释放,这里存在两层引用关闭,只有不被任何对象变量引用的内存才释放的。
我是这么理解的。呵呵
------解决方案--------------------
a2引用:
楼主可以参考里面的内容,另外建议楼主看《深入理解java虚拟机》。书看精看分部分的
http://www.iteye.com/topic/244277