垃圾收集器

Serial

    使用拷贝算法的垃圾回收器,适用于新生代。Serial回收器使用单线程进行垃圾回收。算法

SerialOld

    使用标记-压缩算法的垃圾回收器,适用于老年代。使用单线程进行垃圾回收。数据结构

ParNew

    Serial回收器的多线程版本,使用拷贝算法,多线程并行工做。在多CPU主机上的性能高于Serial,单CPU主机上的性能低于Serial。多线程

Parallel Scavenge

    与ParNew同样,都是用于新生代的并行拷贝算法回收器。区别在于Parallel Scavenge回收器能够控制新生代垃圾回收的stop the world时间。 并发

Parallel Old

    Parallel Scavenge的老年代版本性能

Concurrent Mark Sweep(CMS)

    

CMS是标记-清除的改进算法,用于老年代,可以有效减小STW时长。 
CMS是一种比较复杂的垃圾回收算法,此处尽量进行简明扼要的介绍: 
CMS将标记-清除细分为6个阶段:spa

  • 初始标记
  • 并发标记
  • 并发预清理
  • 从新标记
  • 并发清理
  • 并发重置

详细过程:线程

  1. 初始标记阶段中,CMS回收器标记出被GC Roots直接引用的对象,这一过程须要STW,但因为只进行深度为1的遍历,耗时很短。
  2. 并发标记阶段中,CMS回收器以初始标记阶段标记出的存活对象为根进行可达性遍历。在这一阶段中,不须要STW,其余线程可正常运行。
  3. 并发预清理阶段中,CMS回收器对并发标记阶段中老年代新增的对象从新进行标记。这一阶段存在的目的是尽量减小下一阶段“从新标记”的STW时长。
  4. 从新标记阶段会进入STW,而后进行一次完整的可达性分析,因为前面三个阶段已经完成了绝大部分的工做,因此这一阶段的STW会很短。
  5. 并发清理阶段不须要STW,垃圾回收线程清理标记出的垃圾对象,同时其余线程能够正常工做。
  6. 并发重置阶段中,重置CMS回收器的数据结构,等待下一次垃圾回收。

能够看出来,CMS回收器的思路是把标记-清除算法的工做拆分红多个步骤,其中能够并行的尽量并行,以达到STW时长最小化的目标。 
一样地,CMS回收器也存在着弊端:对象

  • 对CPU要求高,因为部分标记和清除阶段是免STW而且多线程并行的,这就给CPU增长了很大的线程切换压力,核数少的CPU使用CMS回收器的效果并很差,多核多CPU的高性能主机更加适合使用
  • 垃圾回收的同时老年代中仍然在产生新的对象,这是CMS的并行机制致使的。因此CMS回收器不能在老年代满时才开始工做,Hotspot VM 6/7中,CMS回收器在老年代使用率92%时便开始工做。若是在CMS垃圾回收的过程当中,新增的对象占满了剩余的8%空间,便会致使CMS回收失败,自动降级至SerialOld从新进行垃圾回收。(CMS垃圾回收触发的时机可使用-XX:CMSInitiatingOccupancyFraction参数进行设置)
  • CMS使用的是标记-清除算法,而不是标记-压缩算法,这就致使会出现大量的内存碎片。随着内存碎片的增多,最终势必会出现垃圾回收的并发阶段中内存不足的状况,如上所说,此时CMS回收器会自动降级为SerialOld回收器,以标记-压缩算法进行垃圾回收,同时也就会整理好内存碎片。

综上所述能够看出,CMS回收器的机制比前述的任何一种都要精细和复杂,同时对CPU资源的要求也要高出不少,以牺牲性能的代价换取最少的STW时长。内存

G1

相关文章
相关标签/搜索