判断对象存活算法
垃圾收集器对堆进行回收前,第一件事就是要确定这些对象哪些还“存活”,哪些已经“死去”
引用计数算法
概念:给对象添加一个引用计数器,每当有一个地方引用他时就加1,当引用失效时,计数器就减1,任何时刻计数器都为0的对象就是不能被使用的
Java没有使用该算法来管理内存,主要原因是它很难解决对象之间的项目循环引用问题。
TestLoopReference a = new TestLoopReference();
TestLoopReference b = new TestLoopReference();
a.instance = b;
b.instance = a;
a = null;
b = null;
这两个对象已经不能再被访问,但实际上各自维护着对方的对象导致引用计数不为0,导致引用计数算法无法通知GC去回收他们。
根搜索算法
通过一系列的“GCRoots”的对象作为起始点,从这些节点开始往下搜索,搜索的走过的路径称为引用链,当一个对象到“GC Roots”没有引用链可达时(也就是用图论的话说就是从GC Roots到这个对象不可达),则证明此对象是不可用的,这样的对象被判定为是可回收的。
在Java中可作为GC Roots的对象包括下面几种:
- 虚拟机栈(栈帧中的本地变量表)中的引用对象
- 方法区中的类静态属性引用对象
- 方法区中的常量引用对象
- 本地方法栈中JNI的引用对象