现在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的引用计数都不为0,但我们已经无法通过代码的方式来使他们的引用计数归0,这两个对象也就无法被回收。
现在JVM大多采用 可达性分析算法分析是否回收对象。