JVM - 怎么判断对象是否可以被回收? GC Roots?
一般有两种方法来判断:
- 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
- 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。
作为GC Roots的对象包括下面几种:
- 虚拟机栈(栈帧中的本地变量表)中引用的对象。(正在运行当中,是活的)
- 本地方法栈中JNI(即一般说的Native方法)引用的对象。
- 方法区中Static类静态属性引用的对象。Static User u = new User();
- 方法区中Final常量引用的对象。public final Static User u = new User()