JVM - 老年代垃圾收集器CMS产生的问题分析

本文分析了JVM老年代垃圾收集器CMS在GC过程中遇到的promotion failed和concurrent mode failure问题,以及这两个问题产生的原因。解决方案包括调整CMS策略以减少碎片、增大Survivor Space以避免大对象过早晋升,和调整CMS触发阀值以防止concurrent mode failure。通过这些措施,可以优化CMS的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Concurrent Mark Sweep 垃圾收集器,GC 过程中不可避免的问题:

1、 promotion failed

2、concurrent mode failure

 

GC 日志举例:

106.641: [GC 106.641: [ParNew (promotion failed): 14784K->14784K(14784K), 0.0370328 secs]106.678: [CMS106.715: [CMS-concurrent-mark: 0.065/0.103 secs] [Times: user=0.17 sys=0.00, real=0.11 secs]
(concurrent mode failure): 41568K->27787K(49152K), 0.2128504 secs] 52402K->27787K(63936K), [CMS Perm : 2086K->2086K(12288K)], 0.2499776 secs] [Times: user=0.28 sys=0.00, real=0.25 secs]


问题产生的原因:

promotion failed 是新生代进行 Minor GC时, Survivor Space 放不下,对象只能放入老年代,而此时老年代也放不下造成的。多数是由于老年代有足够的空闲空空间但碎片多。此时必然触发 concurrent mode failure。

concurrent mode failure 是在执行 CMS GC 的过程中业务线程将对象放入老年代,而此时老年代空间不足,CMS 还没来得及进行回收; 或者 Minor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值