当CMS检测到老年代变量增速超过历史均值,是否会提前启动GC?
- 内容介绍
- 文章标签
- 相关推荐
本文共计814个文字,预计阅读时间需要4分钟。
CMS的悲观策略并非主动配置的开/关,而是在未启用-XX:UseCMSInitiatingOccupancyOnly时默认启用的动态预测机制。它不依赖于固定的阈值,而是根据老年代对象增长的历年趋势预测,预判即将发生空间不足,从而提前触发CMS GC,避免进入concurrent mode failure或promotion failed等高停顿场景。
悲观策略怎么判断“增长过快”
JVM 持续统计以下数据:
- 每次 CMS GC 后老年代剩余空间大小
- 两次 CMS GC 之间老年代占用增长的绝对值和速率(单位时间增长 MB)
- 最近若干次 Minor GC 晋升到老年代的平均对象大小
- 当前老年代已用空间、剩余空间及晋升压力估算
当监测到:老年代当前增长速率显著高于历史均值,且按此速率推算,剩余空间将在短时间内(例如几秒内)耗尽——JVM 就会“悲观地”认为来不及等达到 CMSInitiatingOccupancyFraction 阈值,于是立即启动 background collector。
本文共计814个文字,预计阅读时间需要4分钟。
CMS的悲观策略并非主动配置的开/关,而是在未启用-XX:UseCMSInitiatingOccupancyOnly时默认启用的动态预测机制。它不依赖于固定的阈值,而是根据老年代对象增长的历年趋势预测,预判即将发生空间不足,从而提前触发CMS GC,避免进入concurrent mode failure或promotion failed等高停顿场景。
悲观策略怎么判断“增长过快”
JVM 持续统计以下数据:
- 每次 CMS GC 后老年代剩余空间大小
- 两次 CMS GC 之间老年代占用增长的绝对值和速率(单位时间增长 MB)
- 最近若干次 Minor GC 晋升到老年代的平均对象大小
- 当前老年代已用空间、剩余空间及晋升压力估算
当监测到:老年代当前增长速率显著高于历史均值,且按此速率推算,剩余空间将在短时间内(例如几秒内)耗尽——JVM 就会“悲观地”认为来不及等达到 CMSInitiatingOccupancyFraction 阈值,于是立即启动 background collector。

