本帖最后由 cup_t 于 2013-08-28 11:22:34 编辑

解决方案 »

  1.   

    不会的,jvm已经考虑到这种相互引用的情况了
      

  2.   

    http://blog.csdn.net/sunmenggmail/article/details/8172273
    这里说不能回收
      

  3.   

    http://blog.csdn.net/sunmenggmail/article/details/8172273
    这里说不能回收
    这种明显的问题,一个正规的商业公司不可能考虑不到的,而且也不是一个不可能解决的问题,现代虚拟机是可以解决这个问题的。
    请参考:http://hi.baidu.com/71167609/item/8bad8069eba97894c5d249f0
      

  4.   

    不能回收,内存泄漏。根搜索算法检测到两个对象没有死亡。
    如果设置a=null;b=null;可以回收。
      

  5.   

    强引用并不能保证对象不被回收。垃圾回收机制除了检查对象是否被引用外,还要看对象是否被至少一个GC roots对象直接或者间接引用。GC roots对象包括以下一些类容:
    1 每个线程当前的函数调用栈,从栈顶到栈底的每个函数里的局部变量。
    2 静态的变量
    3 被jni中引用到的变量。
            所以,上面例子中两个循环引用的对象,虽然都存在一个强引用,但是不被任何GC root对象直接或者间接引用到,垃圾回收机制能够发现这个问题。
            另外,为了验证这一点,特意翻看了一下android源码中GC管理这一块的代码。在MarkSweep.c这文件中,有一个void dvmHeapMarkRootSet()函数,这个函数对于GC root对象,有一些详细的说明,有兴趣的可以细看一下。
            所以,java对于循环引用有一套自己的解决方案。但是话又说回来,一般实际编码中出现的循环引用不会是上面那个例子那样明显,一般都是多个对象复杂的引用导致的循环,这个时候,如果一个对象的生命周期很长,就会导致多个对象都释放不了,所以还是要特别留意对象之间的引用关系。
      

  6.   

    循环引用会被回收。
    JVM从很久以前(可能是1.2)开始就解决了这个问题。这是一个非常基本的问题,一般垃圾回收器都会考虑这个问题(关键词google:jvm circular reference)另外做一个实验吧:
    package test;public class Test {
      private Test obj;
      private String iName;  Test(String name) {
        iName = name;
      }  void setObj(Test o) {
        obj = o;
      }  @Override
      public void finalize() {
        System.out.println("gc!" + iName);
      }  public static void main(final String[] args) throws Exception {
        for (int i = 0; i < 1000; i++) {
          Test a = new Test("a");
          Test b = new Test("b");
          a.setObj(b);
          b.setObj(a);
        }
        
        System.gc();    Thread.sleep(1000);
      }
    }
    输出:
    gc!b
    gc!b
    gc!b
    gc!a
    gc!b
    gc!a
    gc!b
    gc!b
    gc!a
    gc!a
    ...以下略
      

  7.   

    GC root 不可达时可以回收,可达时不能回收。
    下面的代码不能回收public class Test {
      private Test obj;
    private int _10MB = 10 * 1024 * 1024;
    public byte[] bb = new byte[_10MB];
     
      void setObj(Test o) {
        obj = o;
      }
     
      public static void main(final String[] args) throws Exception { Test a = new Test();
    Test b = new Test();
    a.setObj(b);
    b.setObj(a);    System.gc(); 
        
        Thread.sleep(1000);  }
    }