关于引用计数法的循环引用问题

现在JVM大多不采用引用计数法 进行GC,很大程度上是因为引用计数法不能解决循环引用的问题。
如下代码

public class TestClass {

    private Object ref;

    public static void main(String[] args) {

        TestClass o1 = new TestClass(); // 1
        TestClass o2 = new TestClass(); // 2
        o1.ref = o2;					// 3
        o2.ref = o1;					// 4
        o1 = null;						// 5
        o2 = null;						// 6
    }
}

刚开始接触编程的童鞋可能不是很明白,可以看下图
代码执行完第二行时候,对象在内存中是这样分布的
关于引用计数法的循环引用问题_第1张图片

执行完第四行后是这样
关于引用计数法的循环引用问题_第2张图片
执行到最后
关于引用计数法的循环引用问题_第3张图片
此时对象1跟对象2的引用计数都不为0,但我们已经无法通过代码的方式来使他们的引用计数归0,这两个对象也就无法被回收。
现在JVM大多采用 可达性分析算法分析是否回收对象。

你可能感兴趣的:(Java)