外观
一句话答案
CMS 以最短停顿为目标,四阶段:初始标记(STW)→并发标记→重新标记(STW)→并发清除,缺点是内存碎片和浮动垃圾。
核心要点
已在 Q13 中详细描述,此处补充细节。
各阶段 STW 时间估计:
- 初始标记:通常 < 10ms(只标记 GC Root 直接关联对象,数量少)
- 并发标记:通常几百毫秒(与用户线程并发,不停顿用户线程)
- 重新标记:通常 < 100ms(增量标记并发期间变化)
- 并发清除:通常几百毫秒(与用户线程并发)
CMS 调优参数:
bash
-XX:CMSInitiatingOccupancyFraction=70 # 老年代占用70%时触发CMS(默认92%,太晚易CMF)
-XX:+UseCMSCompactAtFullCollection # Full GC 时整理内存碎片
-XX:CMSFullGCsBeforeCompaction=5 # 每5次Full GC后整理一次碎片追问与易错
追问方向:
- CMS 和 G1 的区别?什么时候选 G1?
- Concurrent Mode Failure 什么时候触发?
- CMS 的内存碎片怎么解决?
易错点:
- ❌ CMS 已经淘汰不用学——面试仍然高频考
- ❌ 混淆 CMS 四个阶段的顺序
💡 记忆锚点
CMS四步舞:初始标记(短暂停)、并发标记(不停顿)、重新标记(短暂停)、并发清除(不停顿)。口诀"初并重并,停不停不"。代价:内存碎片(标记-清除不整理)和浮动垃圾(并发期间新产生的垃圾本轮收不掉)。