You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:22:40