跳转至

CMS 并发更新失败

一、CMS 是什么

老年代收集器:并发标记 + 并发清除。

二、并发更新失败(Concurrent Mode Failure)

CMS 在并发标记/清除时,用户线程还在往老年代放对象。如果老年代不够用,CMS 来不及,就触发 Serial Old 单线程 Full GC。

三、为什么

  • 老年代太小。
  • 晋升太快。
  • CMS 太慢。

四、后果

  • Full GC 单线程,STW 长。
  • 性能下降。

五、优化

1. 调大老年代

-XX:NewRatio=2   # 年轻代小,老年代大

2. 提高 CMS 并发

-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0

3. 提高触发阈值

-XX:CMSInitiatingOccupancyFraction=80   # 80% 就开始 CMS

4. 用 G1

JDK 9+ CMS 废弃,G1 是默认。

六、为什么 CMS 被淘汰

  • 并发更新失败问题。
  • 碎片。
  • 复杂。

G1 用分区,没有这个问题。

现在

CMS 已经废弃,新项目用 G1 或 ZGC。