可达性分析算法
原理
通过一系列“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象不一定会成为可回收对象。 不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收
两次标记:
第一次标记为GC Roots的标记过程
标记完后,会判断该对象有没有必要执行finalize()方法(重写了该方法),如果执行,该对象会被放置在F-Queue队列中
第二次标记是对F-Queue队列中的对象进行小规模的标记,如果这个时候,对象还是没有引用链的话,就回收
GC Roots对象
以下对象会被认为是GC Roots对象:
- 虚拟机栈(栈帧中本地变量表)中引用的对象
- 本地方法栈中Native方法引用的对象
- 方法区中静态属性引用的对象
- 方法区中常量引用的对象