CMS垃圾收集器工作流程与优缺点

一、文章概述

CMS(Concurrent Mark Sweep)是JDK1.5推出的并发低延迟老年代垃圾收集器,核心目标是最小化GC全局停顿(STW)时间。它采用标记-清除算法,将大部分耗时操作与用户线程并发执行,仅保留必要的短暂停顿,是互联网、电商等对响应时间敏感场景的里程碑式设计。

二、CMS标准4步工作流程(STW阶段已加粗)

**初始标记 STW**

并发标记

**重新标记 STW**

并发清除

阶段详细说明

  1. ✅ 初始标记(STW,毫秒级):仅标记GC Roots直接关联的对象,停顿极短,保证根集合一致性。
  2. 并发标记(含并发预清理子步骤):与用户线程并行遍历老年代标记存活对象;并发预清理提前标记并发阶段产生的新对象和引用变化,大幅减少后续重新标记的停顿时间。
  3. ✅ 重新标记(STW,最长停顿):修正并发阶段剩余的引用变动,是CMS唯一一次较长停顿,通常控制在几十毫秒内。
  4. 并发清除(含并发重置子步骤):与用户线程并行清理标记的垃圾对象;并发重置清理收集器内部状态,为下一次GC做准备。

三、核心优缺点与解决方案

优点 缺点 对应解决方案
极低延迟,仅两次短暂STW 内存碎片:标记-清除产生不连续空间 -XX:+UseCMSCompactAtFullCollection(Full GC时压缩)
高并发,核心工作与用户线程并行 浮动垃圾:并发清除阶段产生的垃圾无法本次回收 -XX:CMSInitiatingOccupancyFraction=75(提前触发GC)
响应快,适合低延迟业务 CPU敏感,并发阶段占用CPU资源 -XX:ConcGCThreads=N(调整并发GC线程数)

总结

CMS通过4步核心流程和预清理、重置等优化,彻底解决了传统收集器长时间卡顿的问题。虽然存在内存碎片、浮动垃圾等固有缺陷,且最终在JDK9被G1收集器取代,但其并发设计思想和优化手段,仍是现代垃圾收集器的核心基础。

更多推荐