Java之CMS GC的7个阶段

栏目: Java · 发布时间: 5年前

阅读更多

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

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

主要问题:由于不压缩带来的老年代堆碎片,或者在对象分配率高的情况下,都可能导致Full GC。

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

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

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

主要标记过程

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

程序执行情况

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

Java之CMS GC的7个阶段

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

Phase 2: Concurrent Mark(并发标记)

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

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

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

Java之CMS GC的7个阶段

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

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

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

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

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

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

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

Java之CMS GC的7个阶段

清除Dirty对象的Card标识:

Java之CMS GC的7个阶段

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(并发清理)

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

Java之CMS GC的7个阶段

Phase 7: Concurrent Reset(并发重置)

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

参考

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#concurrent_mark_sweep_cms_collector

https://blogs.oracle.com/poonam/understanding-cms-gc-logs

https://blogs.oracle.com/jonthecollector/the-unspoken-phases-of-cms

https://plumbr.io/handbook/garbage-collection-algorithms-implementations#concurrent-mark-and-sweep

https://www.jianshu.com/p/2a1b2f17d3e4

http://psy-lob-saw.blogspot.com/2014/10/the-jvm-write-barrier-card-marking.html

https://www.cnblogs.com/littleLord/p/5380624.html

转载请注明来源:https://zhanjia.iteye.com/blog/2435266

个人公众号

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

Java之CMS GC的7个阶段

0顶

0踩

分享到:

Java之CMS GC Causes

评论


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Rapid Web Applications with TurboGears

Rapid Web Applications with TurboGears

Mark Ramm、Kevin Dangoor、Gigi Sayfan / Prentice Hall PTR / 2006-11-07 / USD 44.99

"Dear PHP, It's over between us. You can keep the kitchen sink, but I want my MVC. With TurboGears, I was able to shed the most heinous FileMaker Pro legacy 'solu-tion' imaginable. It has relationshi......一起来看看 《Rapid Web Applications with TurboGears》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具