高 进阶
CMS收集器#
一句话答案#
CMS 以最短停顿为目标,四阶段:初始标记(STW)→并发标记→重新标记(STW)→并发清除,缺点是内存碎片和浮动垃圾。
核心要点
CMS(Concurrent Mark Sweep)四阶段:
1. 初始标记(Initial Mark) ← STW,极短
仅标记 GC Root 直接关联的对象
2. 并发标记(Concurrent Mark) ← 与用户线程并发,耗时最长
从 GC Root 出发,遍历整个对象图标记所有可达对象
3. 重新标记(Remark) ← STW,较短
修正并发标记期间用户线程导致的引用关系变动(增量更新 Incremental Update)
4. 并发清除(Concurrent Sweep)← 与用户线程并发
清除标记为不可达的对象,释放内存plaintextCMS 的四大缺点:
- 内存碎片:标记-清除算法不整理内存,碎片积累后无法分配大对象,触发 Full GC
- Concurrent Mode Failure:并发清理期间老年代空间不足,退化为 Serial Old 单线程收集(STW 极长)
- CPU 资源竞争:并发阶段占用 CPU 资源(默认启动 (CPU核数+3)/4 个 GC 线程),CPU 核数少时对吞吐影响大
- 浮动垃圾:并发清除阶段用户线程新产生的垃圾本轮无法回收,需等下次 GC
与 G1收集器原理 的核心区别:CMS 仅收集老年代且使用标记-清除(有碎片),G1 以 Region 为单位收集整堆且使用标记-整理(无碎片),G1 支持可预测停顿。
并发漏标:CMS 为什么用增量更新(Incremental Update)?
- CMS 解决并发漏标走的是增量更新路线:写屏障记录”黑对象新增的黑→白引用”,破坏漏标条件①;remark 阶段重新扫描这些被记录的黑对象。
- 代价:remark 需要重新扫描黑对象(甚至从这些黑对象重新出发遍历),停顿相对 G1 偏长;好处是不会产生 SATB 那类浮动垃圾。
- 与 G1 SATB 的对比及两个漏标条件的完整推导,见 垃圾回收算法 的「三色标记与并发漏标」主线。
各阶段 STW 时间估计:
- 初始标记:通常 < 10ms(只标记 GC Root 直接关联对象,数量少)
- 并发标记:通常几百毫秒(与用户线程并发,不停顿用户线程)
- 重新标记:通常 < 100ms(增量标记并发期间变化)
- 并发清除:通常几百毫秒(与用户线程并发)
CMS 调优参数:
-XX:CMSInitiatingOccupancyFraction=70 # 老年代占用70%时触发CMS(默认92%,太晚易CMF)
-XX:+UseCMSCompactAtFullCollection # Full GC 时整理内存碎片
-XX:CMSFullGCsBeforeCompaction=5 # 每5次Full GC后整理一次碎片bash面试回答(2分钟版)
CMS 是以最短停顿时间为目标的老年代收集器,采用标记-清除算法,整个过程分四个阶段。初始标记阶段需要 STW 但很快,只标记 GC Roots 直接关联的对象,通常在 10ms 以内。并发标记阶段与用户线程并发运行,遍历整个对象图,耗时最长但不停顿。重新标记阶段再次 STW,修正并发标记期间因用户线程继续运行而产生变动的对象引用,通常在 100ms 以内。最后并发清除阶段与用户线程并发执行,清理无用对象。CMS 有两个主要缺点:第一是使用标记-清除算法会产生内存碎片,碎片积累到一定程度无法分配大对象时会触发 Full GC;第二是并发清除阶段用户线程仍在产生垃圾即浮动垃圾,本轮无法回收。如果并发清理期间老年代空间不足会触发 Concurrent Mode Failure,退化为 Serial Old 收集,停顿时间大幅增加。生产中一般设置 CMSInitiatingOccupancyFraction 为 70 左右提前触发。
追问与易错
追问方向:
- “CMS 和 G1 的区别?什么时候选 G1?”→ CMS 仅收集老年代用标记-清除有碎片,G1 以 Region 为单位整堆收集用标记-整理无碎片且支持可预测停顿;堆 > 6GB 或需要可控停顿时选 G1
- “Concurrent Mode Failure 什么时候触发?”→ 并发清理阶段老年代空间不足以容纳新晋升的对象时触发,退化为 Serial Old 单线程收集,STW 时间大幅增加;调低 CMSInitiatingOccupancyFraction 提前触发可预防
- “CMS 的内存碎片怎么解决?”→ 开启 -XX:+UseCMSCompactAtFullCollection 在 Full GC 时整理碎片,配合 CMSFullGCsBeforeCompaction 控制整理频率;或直接升级到 G1 从根本上避免碎片
易错点:
- ❌ CMS 已经淘汰不用学——面试仍然高频考
- ❌ 混淆 CMS 四个阶段的顺序