CMS 并发更新失败¶
一、CMS 是什么¶
老年代收集器:并发标记 + 并发清除。
二、并发更新失败(Concurrent Mode Failure)¶
CMS 在并发标记/清除时,用户线程还在往老年代放对象。如果老年代不够用,CMS 来不及,就触发 Serial Old 单线程 Full GC。
三、为什么¶
- 老年代太小。
- 晋升太快。
- CMS 太慢。
四、后果¶
- Full GC 单线程,STW 长。
- 性能下降。
五、优化¶
1. 调大老年代¶
2. 提高 CMS 并发¶
3. 提高触发阈值¶
4. 用 G1¶
JDK 9+ CMS 废弃,G1 是默认。
六、为什么 CMS 被淘汰¶
- 并发更新失败问题。
- 碎片。
- 复杂。
G1 用分区,没有这个问题。
现在
CMS 已经废弃,新项目用 G1 或 ZGC。