可达性分析算法之前有一个叫引用计数法,原理非常简单如果一个对象没有任何引用与之关联,基本上对象不可能在其他地方用的上,这个对象就成为可被回收的对象,但是这个方法虽然非常简单,而且高效,但是它无法解决循环调用的问题,如下图所示:
public class Main {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.o = d2;
d2.o = d1;
d1 = null;
d2 = null;
}
}
class Demo{
public Object o = null;
}
可达性分析算法
此算法的核心思想:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为“引用链”,当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用。
注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
在Java语言中,可作为GC Roots的对象包含以下几种: