之前已经讲述过利用引用计数器法来判断对象是否存活的方法,本文介绍另一种应用更加广泛,在内存回收方面效率更高的方法--可达性分析算法。
在主流的程序设计语言(比如Java,C#等)的实现中,都是通过可达性分析算法来判断对象是否存活的,这个算法的基本思路是:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots节点没有任何引用链相连接时,在图的角度上讲,就是说从GC Roots节点到该对象不可达时,则证明这个对象是不可达的。
左侧为依然存活的对象,右侧为可回收的对象。
在Java语言中,可作为GC Roots的对象包括下面几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中的静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法区中JNI引用的对象