本文目录#

代码缓存的重要性#

HotSpot 将 JIT 编译后的机器码存放在 Code Cache 中。Code Cache 满了会导致 CodeCache is full、编译暂停甚至降级为解释执行,引发延迟飙升。因此需要持续监控其使用情况,并根据编译负载调整容量。

监控方式#

  • -Xlog:codecache+size=info(JDK 11+)输出使用情况;
  • jcmd <pid> Compiler.codecache 查看分区(non-profiled、profiled、non-nmethod);
  • JFR 事件 CodeCacheFull, Compilation
  • Micrometer jvm.info + 自定义 JMX 采集 CodeCacheManager 指标。

调优选项#

  • -XX:ReservedCodeCacheSize:默认 ~240MB,可根据服务规模调大;
  • -XX:InitialCodeCacheSize:预留初始大小,减少扩容停顿;
  • 禁用不必要的编译优化:-XX:TieredStopAtLevel=1(调试用);
  • 结合 AOT(JEP 295)或 GraalVM Native Image 减少 JIT 压力。

自检清单#

  • 是否定期检查 Code Cache 使用率并配置告警阈值(80%、90%)?
  • 是否评估编译日志中存在的 CodeCache is full 问题?
  • 是否在变更后(升级 JDK、引入新框架)复测编译压力?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。