一、判断对象是否存活算法
1.引用计数法
在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1.当引用失效的时候,计数器的值就-1,计数器初始值为1,当计数器值为0时,就意味着这个对象是个垃圾对象,Gc就可以对这个对象进行回收。
计数器算法的一大缺点就是不能解决循环引用的问题;如下图,我们构造了一个列表,我们将最后一个元素的next属性指向第一个元素,即引用第一个元素,从而构成循环引用;这个时候如果我们将列表的头head赋值为null,此时列表的各个元素的计数器都不为0,同时我们也失去了对列表的引用控制,从而导致列表元素不能被回收!
引用计数法的特点:
- 需要单独的字段存储计数器,增加了存储空间的开销;
- 每次赋值都需要更新计数器,增加了时间开销;
- 垃圾对象便于辨识,只要计数器为0,就可作为垃圾回收;
- 及时回收垃圾,没有延迟性;
- 不能解决循环引用的问题;
2.可达性分析法
通过一系列的作为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路劲称为引用链,当一个对象到GC Roots没有任何的引用链相连接是,则说明此对象不可达,即无用对象。也就是垃圾回收器回收的对象。
可以作为GC Roots的对象:
- 虚拟机栈中栈帧里的本地变量表中引用的对象;
- 本机放发栈的JN所引用的对象;
- 方法区的静态变量和常量所引用的对象
如上图所示: 其中ObjF 、ObjD与ObjE没有引用链与GC Roots对象相连接,所以就为不可达对象,就会被垃圾回收器回收。