可达性分析算法属于JVM垃圾回收很重要的内容,下面我就重点来详解可达性分析算法的作用与实现@mikechen
什么是可达性分析算法
可达性分析算法是一种计算机算法,用于确定有向图中某个节点是否可达到其他节点。
可达性分析算法作用
JVM垃圾回收,首先要解决的的就是哪些对象需要回收?所以就需要一种算法来判断一个对象是应该生存还是死亡。
所以,可达性分析算法就是来解决这件事的,主要用于确定哪些对象可以被垃圾回收器回收。
目前主流的商用JVM,都是通过可达性分析来判断对象是否可以被回收的。
可达性分析算法思路
谈了为什么需要可达性分析算法,下面我接着谈可达性分析算法的设计思路。
可达性分析算法又被称为根搜索算法,GC 定义了一些根(GC Roots),从根开始不断搜索,能够被引用到的对象就不是垃圾,不能被引用到的对象就是垃圾。
如下图所示:
GC Roots
可达性分析算法的GC Roots是指一组对象,这些对象被认为是Java虚拟机中的根对象,是可达性分析算法的起点。
GC Roots包括以下几种类型的对象:
- 虚拟机栈中引用的对象:指当前线程执行的方法中,局部变量和输入参数引用的对象。这些对象是根对象的直接引用。
- 方法区中类静态属性引用的对象:指类静态变量引用的对象,如常量、静态变量等。这些对象是Java虚拟机中的常驻对象,因此也是根对象。
- 方法区中常量引用的对象:指在类或接口中使用final修饰符声明的常量,也是Java虚拟机中的常驻对象。
- 本地方法栈中JNI(Java Native Interface)引用的对象:指使用JNI接口调用的本地方法中引用的Java堆对象。
可达性分析算法思路
这个算法的基本思路:
- 就是通过一系列的成为“GC Roots”的对象作为起始点;
- Java虚拟机会遍历这些根对象,找到它们所引用的对象,将这些对象标记为“存活”,如上图红色框标识;
- 当一个对象到GC Roots没有任何引用链相连,即从GC Roots到这个对象不可达,则证明此对象是不可用,就表示可回收的对象;
- 这个过程会一直进行下去,直到没有任何未被标记的对象。
可达性分析算法适合
可达性分析算法主要用于垃圾回收的实现,它的核心思想是通过一系列的标记和扫描操作来确定哪些对象可以被垃圾回收器回收。
以上就是可达性分析算法详解,更多JVM垃圾回收算法,请查看:4种JVM垃圾回收算法详解
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》