切换至OpenJDK 21后G1GC模式下CodeCache持续增长问题咨询
OpenJDK 21 + G1GC 下 CodeCache 持续增长问题分析
从你提供的CodeCache监控图可以看到,non-profiled nmethod和profiled nmethod区域的占用量持续上升,结合你的场景,以下是针对性的分析和信息:
核心逻辑变更确认
- 你提到的JDK-8290025确实是问题根源:OpenJDK 21对G1GC的CodeCache回收逻辑做了调整,G1GC不再启动独立的CodeCache Sweeper线程,仅在FullGC阶段才会执行CodeCache的清理操作。
- ParallelGC则保留了原有逻辑,会定期通过Sweeper线程扫描并回收废弃的nmethod,这也是切换GC后问题消失的原因。
受影响区域说明
non-profiled nmethod和profiled nmethod是Segmented CodeCache中动态性最强的区域:
- 这两类nmethod会随着JIT编译的热点更新、类卸载、代码失效等场景不断产生废弃实例,但G1GC在非FullGC阶段不会主动回收这些废弃代码,导致占用持续增长。
同类问题反馈
不少长期运行的应用(如微服务、后台持续服务)在OpenJDK 21 + G1GC环境下都遇到过该问题,尤其当应用长期不触发FullGC时,废弃nmethod会持续堆积,最终可能导致CodeCache耗尽,触发CodeCache is full警告,甚至引发JIT编译停滞、性能下降等问题。
可行临时方案
- 定期手动触发FullGC:使用
jcmd <pid> GC.run_full命令主动触发,强制清理CodeCache中的废弃代码; - 调整CodeCache预留大小:通过
-XX:ReservedCodeCacheSize和-XX:InitialCodeCacheSize参数增大CodeCache空间,缓解耗尽压力,但无法从根本上解决堆积问题; - 切换GC收集器:若业务场景允许,切换回ParallelGC可直接规避该问题。
内容的提问来源于stack exchange,提问作者Petr Bouda
相关产品推荐
相关产品推荐

