本帖最后由 mweibiao 于 2012-10-27 17:24:20 编辑

解决方案 »

  1.   

    正是因为这种情况,所以引用计数收集器不好,也因此Sun的JDK并没有采用这种方法实现GC。
      

  2.   

    http://topic.csdn.net/u/20121020/21/acbaa39a-2f80-4718-8f0b-95515f2e2bb5.html
      

  3.   

    我是这么理解的,说错轻拍~
    维护一个反向引用列表就行了abstract class Root{
    private List<Object> incomingReferenceList = new ArrayList<Object>();

    public void addIncomingReferenceObject(Object obj){
    if(!incomingReferenceList.contains(obj))
    incomingReferenceList.add(obj);
    }

    public int getReferencedCount(){
    return incomingReferenceList.size();
    }
    }class A extends Root{
    private B b;

    public void setB(B b){
    this.b = b;
    b.addIncomingReferenceObject(this);
    }
    }class B extends Root{
    private A a;

    public void setA(A a){
    this.a = a;
    a.addIncomingReferenceObject(this);
    }
    }
      

  4.   

    我记得没用引用计数的原因是循环引用的时候垃圾收集不能判断这个对象是否能直接或间接被GC_ROOT引用,而不是因为循环引用的次数不好计算吧。。
      

  5.   

    这个是不是每个虚拟机实现都是不一样的,这个java编程思想上有讲过
      

  6.   

    这种方法似乎没有用在任何JVM的实现上。因为要定位这样的交互自引用的对象组代价是很大的。怎么定位呢?简单的保存引用就是一种方法,与之前的引用做比较即可。环的判别算法应该可以应用在这上面。