Java之CMS GC的7个阶段

CMS收集器的主要设计目标是:低应用停顿时间。它经过两种方式实现这一目标:html

  1. 不压缩老年代,而是使用空闲列表来管理回收空间。
  2. 大部分标记清理工做与应用程序并发执行。

主要问题:因为不压缩带来的老年代堆碎片,或者在对象分配率高的状况下,均可能致使Full GC。java

CMS收集器的GC周期主要由7个阶段组成,其中有两个阶段会发生stop-the-world,其余阶段都是并发执行的。(亦有4个阶段、6个阶段等说法)数据结构

Phase 1: Initial Mark(初始化标记)

初始化标记阶段,是CMS GC的第一个阶段,也是标记阶段的开始。主要工做是标记可直达的存活对象多线程

主要标记过程并发

  • 从GC Roots遍历可直达的老年代对象;
  • 遍历被新生代存活对象所引用的老年代对象。

程序执行状况oracle

  • 支持单线程或并行标记。
  • 发生stop-the-world,暂停全部应用线程。

(Marked obj:老年代绿色圆点表示被初始化标记的对象。)jvm

Phase 2: Concurrent Mark(并发标记)

并发标记阶段,是CMS GC的第二个阶段。ide

在该阶段,GC线程和应用线程将并发执行。也就是说,在第一个阶段(Initial Mark)被暂停的应用线程将恢复运行。ui

并发标记阶段的主要工做是,经过遍历第一个阶段(Initial Mark)标记出来的存活对象,继续递归遍历老年代,并标记可直接或间接到达的全部老年代存活对象线程

(Current obj:该对象的引用关系发生变化,对下一个对象的引用被删除。)

因为在并发标记阶段,应用线程和GC线程是并发执行的,所以可能产生新的对象或对象关系发生变化,例如:

  • 新生代的对象晋升到老年代;
  • 直接在老年代分配对象;
  • 老年代对象的引用关系发生变动;
  • 等等。

对于这些对象,须要从新标记以防止被遗漏。为了提升从新标记的效率,本阶段会把这些发生变化的对象所在的Card标识为Dirty,这样后续就只须要扫描这些Dirty Card的对象,从而避免扫描整个老年代。

Phase 3: Concurrent Preclean(并发预清理)

在并发预清洗阶段,将会从新扫描前一个阶段标记的Dirty对象,并标记被Dirty对象直接或间接引用的对象,而后清除Card标识

标记被Dirty对象直接或间接引用的对象:

清除Dirty对象的Card标识:

Phase 4: Concurrent Abortable Preclean(可停止的并发预清理)

本阶段尽量承担更多的并发预处理工做,从而减轻在Final Remark阶段的stop-the-world

在该阶段,主要循环的作两件事:

  • 处理 From 和 To 区的对象,标记可达的老年代对象;
  • 和上一个阶段同样,扫描处理Dirty Card中的对象。

具体执行多久,取决于许多因素,知足其中一个条件将会停止运行:

  • 执行循环次数达到了阈值;
  • 执行时间达到了阈值;
  • 新生代Eden区的内存使用率达到了阈值。

Phase 5: Final Remark(从新标记)

预清理阶段也是并发执行的,并不必定是全部存活对象都会被标记,由于在并发标记的过程当中对象及其引用关系还在不断变化中。

所以,须要有一个stop-the-world的阶段来完成最后的标记工做,这就是从新标记阶段(CMS标记阶段的最后一个阶段)。主要目的是从新扫描以前并发处理阶段的全部残留更新对象

主要工做:

  • 遍历新生代对象,从新标记;(新生代会被分块,多线程扫描)
  • 根据GC Roots,从新标记;
  • 遍历老年代的Dirty Card,从新标记。这里的Dirty Card,大部分已经在Preclean阶段被处理过了。

Phase 6: Concurrent Sweep(并发清理)

并发清理阶段,主要工做是清理全部未被标记的死亡对象,回收被占用的空间

Phase 7: Concurrent Reset(并发重置)

并发重置阶段,将清理并恢复在CMS GC过程当中的各类状态,从新初始化CMS相关数据结构,为下一个垃圾收集周期作好准备。


参考

docs.oracle.com/javase/8/do…

blogs.oracle.com/poonam/unde…

blogs.oracle.com/jonthecolle…

plumbr.io/handbook/ga…

www.jianshu.com/p/2a1b2f17d…

psy-lob-saw.blogspot.com/2014/10/the…

www.cnblogs.com/littleLord/…

我的公众号

更多文章,请关注公众号:二进制之路

二进制之路
相关文章
相关标签/搜索