关于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的内存都不能释放?
------解决方案--------------------
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