1 对象存活分析
1.1 引用计数法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能在使用的,可以,就可以被回收。
弊端:很难解决对象之间相互循环引用的问题。
public class ReferenceCountingGc {
public Object ojb = null;
public static void main(String[] args) {
ReferenceCountingGc a = new ReferenceCountingGc();
ReferenceCountingGc b = new ReferenceCountingGc();
a.ojb = b;
b.ojb = a;
// 对象引用只减一 还为一,不为0,导致无法被回收
a = null;
b = null;
System.gc();
}
}
1.2 可达性分析算法
这个算法的基本思路就是通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的
,下图对象object5, object6, object7虽然有互相关联,但它们到GC Roots是不可达的,因此它们将会被判定为是可回收对象。
在Java语言里,可作为GC Roots 的对象包括下面几种:
- 虚拟机栈(
栈桢中的本地变量表
)中的引用的对象 - 方法区中的
类静态属性
引用的对象 - 方法区中的
常量引用
的对象 - 本地方法栈中
JNI
(通常所说的Native方法)引用的对象