一、判断对象是否存活?
这个算法的基本思路就是:
通过一系列的称为“GC Roots”的对象作为起始点
从这些节点开始向下搜索,搜索所走过的路径称为引用链
当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。
作为 GC Roots 的对象主要包括下面几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象;各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。
- 方法区中类静态属性引用的对象;java 类的引用类型静态变量。
- 方法区中常量引用的对象;比如:字符串常量池里的引用。
- 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
二、 GC Roots可达性分析图
- 黄色部分就是GC Roots不可达,蓝色部分都是可达
- 可达的对象不能被回收,因为有对象引用使用它
- 不可达的对象就是需要被回收的