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

Java 11.0.11升级至11.0.13后CodeCache异常及CPU占用升高问题咨询

问题解答

CodeHeap 'profiled nmethods' 收缩后不再升高的原因

这个现象完全是Java 11.0.12版本引入的Code Cache组件改动直接导致的,核心逻辑变动有两点:

  • JDK-8223444 改动将原有全局CodeCache的回收阈值调整为按分段独立计算:Java 11默认将CodeHeap分为三个独立分段,profiled nmethods(C1编译代码)、non-profiled nmethods(C2编译代码)、non-method(JVM内部代码),默认分配比例为48%:48%:4%。旧版本只有全局CodeCache打满时才触发全量回收,新版本只要任意一个分段占用达到阈值,就会触发该分段的激进回收。你初始配置的-XX:ReservedCodeCacheSize=375m对应profiled nmethods段上限约180MB,和你观察到的184MB上限完全匹配,该段打满后就会触发持续回收。
  • JDK-8231460 改动调整了Sweeper线程的触发逻辑:旧版本Sweeper按固定间隔执行,新版本会根据CodeHeap的占用率动态调整执行频率,占用越高执行越频繁。当profiled nmethods段打满后,Sweeper会持续扫描回收所有调用频率低于阈值的C1编译代码,同时为了避免短时间内再次占满,回收后会临时调高C1代码的老化门槛,后续新生成的C1代码会直接被判定为冷代码,不会存入CodeHeap,因此该段占用会一直维持在低水平不再回升。

你调整到512M时仍然触发回收,是因为该配置下profiled nmethods分段上限约245MB,而你业务实际需要的C1代码存储空间为258MB左右,仍然超过阈值,所以还是会触发持续回收,直到调至1024M后分段上限提升到508MB,完全满足业务存储需求,回收逻辑才会恢复正常。

带来的影响

  • 固定CPU开销上升:你观察到的5% CPU使用率上涨,完全是Sweeper线程高频运行导致的,你提供的perf采样数据中Sweeper线程占了接近5%的CPU占比就是直接证据。
  • 隐性性能损耗:大量C1编译代码被回收后,原本应该执行C1编译代码的热点方法会退回解释执行,或者频繁触发重新编译,会额外消耗CPU资源,也可能导致偶发的请求延迟升高,恒定负载场景下该影响不明显,若有周期性热点方法切换则会更突出。
  • 当CodeCache配置足够大时,新版本的CodeCache管理效率反而优于旧版本,你观察到1024M配置下CPU使用率比旧版375M配置略优就是该情况的体现。

内容的提问来源于stack exchange,提问作者Josef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:05