Java虚拟机:GC算法深度解析(一)

  • 来源:
  • 更新日期:2018-05-23

摘要:在前面的文章里介绍了可达性分析算法,它为我们解决了判定哪些对象可以回收的问题,接下来就该我们的垃圾收集算法出场了。

 在前面的文章里介绍了可达性分析算法,它为我们解决了判定哪些对象可以回收的问题,接下来就该我们的垃圾收集算法出场了。

不同的垃圾收集算法有各自不同的优缺点,在JVM实现中往往不是采用单一的一种算法进行回收而是采用几种不同的算法组合使用来达到最好的收集效果。接下来详细介绍几种垃圾收集算法的思想及发展过程。
150020ftcfmltuctt2t2u2.jpg
最基础的收集算法 -- 标记/清除算法
之所以说标记/清除算法是几种GC算法中最基础的算法是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。标记/清除算法就是分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象在标记完成后统一回收所有被标记的对象。
标记阶段:标记的过程其实就是前面介绍的可达性分析算法的过程遍历所有的GC Roots对象,对从GC Roots对象可达的对象都打上一个标识一般是在对象的header中将其记录为可达对象;
清除阶段:清除的过程是对堆内存进行遍历如果发现某个对象没有被标记为可达对象则将其回收。
在垃圾收集器进行GC时必须停止所有Java执行线程原因是在标记阶段进行可达性分析时不可以出现分析过程中对象引用关系还在不断变化的情况否则的话可达性分析结果的准确性就无法得到保证。在等待标记清除结束后应用线程才会恢复运行。