JVM 源码分析12 YGC 深入分析

本文详细分析了JVM中YGC的触发原因和实现过程,特别是数组动态扩容如何导致频繁的FGC。讨论了参数-XX:CMSScavengeBeforeRemark的作用,以及其在降低CMS重新标记阶段时间上的影响。同时,介绍了YGC的两个主要步骤:查找GC Roots和遍历活跃对象,以及在不同场景下的决策逻辑,如晋升到老年代的条件和并发问题处理。

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

数组动态扩容导致频繁FGC

参数:-XX:CMSScavengeBeforeRemark
含义:
Enable scavenging attempts before the CMS remark step.
开启或关闭在CMS重新标记阶段之前的清除(YGC)尝试
CMS并发标记阶段与用户线程并发进行,此阶段会产生已经被标记了的对象又发生变化的情况,若打开此开关,可在一定程度上降低CMS重新标记阶段对上述“又发生变化”对象的扫描时间,当然,“清除尝试”也会消耗一些时间
注,开启此开关并不会保证在标记阶段前一定会进行清除操作

CMS重新标记前,进行YGC清除操作

先不打开CMSScavengeBeforeRemark 参数;

     可以看出发生FGC的时候,并没有触发YGC,所以老年代的对象一直回收不了,因为老年代进行GC时,会把新生代的对象作为GC root,在本场景中,新生代的对象不回收,老年代的对象也无法回收,而且老年代的内存使用率已经超过设置的阈值90%,所以会不断的进行FGC。

然后 JVM参数中添加-XX:+CMSScavengeBeforeRemark,打开重新标记前进行YGC

 

YGC实现过程

新生代内存分配失败触发YGC

    如果是因为新生代内存分配失败触发YGC时&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值