对象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

解决方案 »

  1.   

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

  2.   

    a1里面有2个成员变量,b1,b2啊。我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?
      

  3.   

    a1里面有2个成员变量,b1,b2啊。我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?
    a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。
      

  4.   

    a1里面有2个成员变量,b1,b2啊。我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?
    a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。a1里面的b1没有被a2引用着啊,这两个都是引用,指向同一个对象
      

  5.   

    楼主对 reference 赋值的理解有问题。
      

  6.   

    a1里面有2个成员变量,b1,b2啊。我知道两个,我的意思是,a1里面保存的应该是b1的引用而不是b1本体吧?
    a1里面有b1的引用,现在把a1=null,但是a1里面的b1还a2引用着,这样a1能回收吗。a1里面的b1没有被a2引用着啊,这两个都是引用,指向同一个对象
    我的意思就是 原来a1里面的b1指向的对象还被a2.b1引用着,这样把a1=null后,整个a1能回收吗。
      

  7.   

    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了。
      

  8.   

    可以肯定a2的内存肯定不会被回收,从内存被GC回收的条件看,虽然a1=null,但是它引用的内存还是被a2站着,也就是这块内存还在gc链中,所以a1的内存应该也不会被回收,具体到A的 b1 b2,b1肯定不被回收,b2按正常推理也不会被回收,但是要是jvm做什么优化就不得而知 
      

  9.   

    jvm使用的是根搜索算法,查找一个对象是否可以被回收。
    如果存在根对象到一个对象的引用,那么这个对象就不能被回收。
      

  10.   

    gc的时候是有向图搜索,从静态变量,或者活跃线程的临时变量开始搜索,搜索不到的都可以回收。
    a2不能被回收,a2中的b1就不能回收,b1中没有引用a1,所以a1可以回收
      

  11.   

    楼主可以参考里面的内容,另外建议楼主看《深入理解java虚拟机》。书看精看分部分的
    http://www.iteye.com/topic/244277
      

  12.   

    a1,a2都是类型为A的对象变量,其引用的对象中分别存在b1,b2两个对象变量,如果楼主没有显示定义A的缺省构造器的话,b1,b2均无引用,都是null。假定楼主的代码中是定义了无参构造器的,那最终a2.b1指向原先的a1.b1,当a1被复制null后,a1引用的对应就可以被GC了,但是当前a2.b1引用的内存是不被GC的。也就是说a1引用的对象并没有完全释放,这里存在两层引用关闭,只有不被任何对象变量引用的内存才释放的。
    我是这么理解的。呵呵
      

  13.   

    当出现new关键字的时候,JVM就会分配内存。new出来的对象是不一样的。楼主应该多了解一些内存的分配情况
      

  14.   

    a2引用了a1,对象引用其实只是内存地址。a1被回收了,不影响a2的。LZ有这么个思考,对学习大有好处。