JVM学习总结(二)垃圾回收器

一、判断对象是否存活算法

1.引用计数法

在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1.当引用失效的时候,计数器的值就-1,计数器初始值为1,当计数器值为0时,就意味着这个对象是个垃圾对象,Gc就可以对这个对象进行回收。

计数器算法的一大缺点就是不能解决循环引用的问题;如下图,我们构造了一个列表,我们将最后一个元素的next属性指向第一个元素,即引用第一个元素,从而构成循环引用;这个时候如果我们将列表的头head赋值为null,此时列表的各个元素的计数器都不为0,同时我们也失去了对列表的引用控制,从而导致列表元素不能被回收!

 引用计数法的特点:

  1.   需要单独的字段存储计数器,增加了存储空间的开销;
  2.   每次赋值都需要更新计数器,增加了时间开销;
  3.   垃圾对象便于辨识,只要计数器为0,就可作为垃圾回收;
  4.   及时回收垃圾,没有延迟性;
  5.   不能解决循环引用的问题;

2.可达性分析法

通过一系列的作为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路劲称为引用链,当一个对象到GC Roots没有任何的引用链相连接是,则说明此对象不可达,即无用对象。也就是垃圾回收器回收的对象。

可以作为GC Roots的对象:

  1. 虚拟机栈中栈帧里的本地变量表中引用的对象;
  2. 本机放发栈的JN所引用的对象;
  3. 方法区的静态变量和常量所引用的对象

如上图所示: 其中ObjF 、ObjD与ObjE没有引用链与GC Roots对象相连接,所以就为不可达对象,就会被垃圾回收器回收。

猜你喜欢

转载自blog.csdn.net/qq_37776015/article/details/82221575