0
点赞
收藏
分享

微信扫一扫

垃圾回收之CMS GC

SPEIKE 2022-04-29 阅读 65
java

 一.六个阶段

阶段 1: Initial Mark(初始标记)

这个阶段伴随着 STW 暂停。初始标记的目标是标记所有的 根对象,包括根对象直接引用的对象,以及被年轻代中所 有存活对象所引用的对象(老年代单独回收)。

阶段 2: Concurrent Mark(并发标记)

在此阶段,CMS GC 遍历老年代,标记所有的存活对象,从 前一阶段 “Initial Mark” 找到的根对象开始算起。 “并发标 记”阶段,就是与应用程序同时运行,不用暂停的阶段。

阶段 3: Concurrent Preclean(并发预清理)

此阶段同样是与应用线程并发执行的,不需要停止应用线 程。 因为前一阶段【并发标记】与程序并发运行,可能 有一些引用关系已经发生了改变。如果在并发标记过程中 引用关系发生了变化,JVM 会通过“Card(卡片)”的方 式将发生了改变的区域标记为“脏”区,这就是所谓的 卡片 标记(Card Marking)。 

阶段 4: Final Remark(最终标记)

最终标记阶段是此次 GC 事件中的第二次(也是最后一次)STW 停顿。本阶段的目标是完成老年代中所有存活对象的标记。因为 之前的预清理阶段是并发执行的,有可能 GC 线程跟不上应用程 序的修改速度。所以需要一次 STW 暂停来处理各种复杂的情况。 通常 CMS 会尝试在年轻代尽可能空的情况下执行 Final Remark 阶段,以免连续触发多次 STW 事件。

阶段 5: Concurrent Sweep(并发清除)

此阶段与应用程序并发执行,不需要 STW 停顿。JVM 在此 阶段删除不再使用的对象,并回收他们占用的内存空间。

阶段 6: Concurrent Reset(并发重置)

此阶段与应用程序并发执行,重置 CMS 算法相关的内部 数据,为下一次 GC 循环做准备

二.CMS优缺点

CMS 垃圾收集器在减少停顿时间上做了很多复杂而有用的 工作,用于垃圾回收的并发线程执行的同时,并不需要暂停 应用线程。 当然,CMS 也有一些缺点,其中最大的问题就 是老年代内存碎片问题(因为不压缩),在某些情况下 GC 会造成不可预测的暂停时间,特别是堆内存较大的情况下。

举报

相关推荐

0 条评论