cms收集器通过四阶段(初始标记、并发标记、重新标记、并发清除)将停顿拆分为两次极短stw并辅以并发执行,采用三色标记与增量更新保障正确性,专用于老年代且须配parnew,以标记-清除避免移动但导致碎片化。

CMS收集器的核心架构设计围绕“最小化Stop-The-World时间”展开,不是靠单次GC更快,而是把原本一次长停顿拆解为两次极短停顿(初始标记、重新标记)+ 两次并发阶段(并发标记、并发清除),让大部分工作与用户线程并行。
四阶段协同机制
整个回收流程严格划分为四个逻辑阶段,各阶段职责明确、衔接紧凑:
- 初始标记:仅标记GC Roots直接引用的对象,必须STW,但耗时微秒级;
- 并发标记:从上一阶段对象出发遍历整个可达对象图,全程与用户线程并发执行;
- 重新标记:修正并发期间因对象引用变更导致的漏标,需STW,但通过卡表(Card Table)和增量更新优化,控制在几毫秒内;
- 并发清除:回收所有未被标记的对象内存,不移动存活对象,全程并发,无STW。
三色标记保障并发安全
CMS采用三色标记法(白、灰、黑)管理对象状态,并在并发过程中引入增量更新(Incremental Update)策略:每当用户线程修改引用时,将被修改的对象重新标为灰色,加入重新标记队列。这避免了漏标,是支撑并发正确性的关键机制。
老年代专用 + 新生代绑定
CMS本身只负责老年代回收,必须搭配新生代收集器使用。JDK 5起默认绑定ParNew,形成“ParNew + CMS”组合。它不兼容Parallel Scavenge,也不支持G1之前的其他新生代算法,这种强耦合是其架构上的硬性约束。
无压缩设计带来的权衡
采用标记-清除算法,意味着不进行内存整理。优点是清除阶段无需移动对象、并发友好;缺点是长期运行后产生内存碎片,可能触发Concurrent Mode Failure,退化为Serial Old的Full GC——这是其低延迟承诺的边界条件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











