发布于2026-05-23 阅读(0)
扫一扫,手机访问

在 CMS 垃圾收集器的世界里,“并发模式失败”(Concurrent Mode Failure)是个需要警惕的信号。一旦发生,意味着老年代因为内存碎片太多,已经无法为大对象找到安身之所。这时,JVM 会果断按下暂停键,中止 CMS 的并发流程,转而触发一次彻底的 Full GC。而执行这次“大扫除”的,正是那个经典而稳重的 Serial Old 收集器。
当然,并非所有的 CMS 收集失败都会走到 Serial Old 这一步。只有当下面几种情况出现时,这个后备方案才会被激活:
-XX:CMSInitiatingOccupancyFraction 参数),但完整的一轮收集周期还没走完。你可能会问,为什么偏偏是 Serial Old 来兜这个底?原因其实很清晰:
想知道系统是不是真的动用了 Serial Old?翻翻 GC 日志就能找到蛛丝马迹。关键线索通常出现在日志的末尾,重点关注收集器的标识和行为特征:
[CMS-concurrent-mark: ...] (concurrent mode failure) 这类字样之后,紧接着会看到 [Full GC [Tenured: ...] 或者 [CMS: ...] [Tenured: ...] 这样的记录。SerialOld 或 Serial MarkSweepCompact 这样的关键词(具体用词取决于你的 JVM 版本)。[Times: user=..., real=...] 这部分,如果 real(实际耗时)远大于 user(CPU 耗时),那基本可以断定发生了长时间的用户线程暂停。CMS-concurrent-preclean),也没有多线程 GC 的线程数信息,因为 Serial Old 是“单干户”。必须承认,回退到 Serial Old 本身是一种保护机制,但代价相当高昂:
短期内,可以尝试调低 -XX:CMSInitiatingOccupancyFraction 这个参数(比如设为 70),让 CMS 更早一点启动收集,给老年代多留点余量。但从长远来看,更好的选择是评估并切换到像 G1(自带内存整理,抗碎片能力强)或 ZGC 这样的新一代收集器,从根本上避免依赖这种高成本的“兜底”机制。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8