概要
通过一系列的GC roots的对象为起始点,开始向下搜索,当一个对象到GC Roots没有任何引用相连,则证明
此对象为不可用,并将被判定为是可回收的对象。
那些对象可作为GC Roots对象?
被启动类(bootstrap加载器)加载的类和创建的对象
jvm运行时方法区类静态变量(static)引用的对象
jvm运行时方法区常量池引用的对象
jvm当前运行线程中的虚拟机栈变量表引用的对象
本地方法栈中(jni)引用的对象
分析
public class TestGC {
public Object instance;
private final static int _1M = 1024 * 1024;
private byte[] bytesize = new byte[2*_1M];
public static void testGC() {
TestGC A = new TestGC();
TestGC B = new TestGC();
A.instance = B;
B.instance = A;
A = null;
B = null;
System.gc();
}
}
可达性分析算法即使存在互相引用的对象,但如果这两个对象无法访问到根对象,还是会被回收。
拓展
上面个提到的可达性分析算法中涉及的引用是指Java中的强引用。
Java将引用分为如下几种:
1.强引用:如Object obj = new Object();这类引用