← 中文资源

简体中文版本

JVM: CodeCache is full. Compiler has been disabled

修复 JVM 的 CodeCache is full 告警与吞吐下降:合理设置 ReservedCodeCacheSize 并排查代码生成泄漏。

阅读英文原文

症状

JVM 打印 CodeCache is full. Compiler has been disabled,随后请求延迟上升、CPU 反而下降,因为不再有新的方法被 JIT 编译。通常在持续流量数小时后出现。

诊断

观察代码缓存与类加载器:

jcmd $(pgrep -f myapp.jar) PerfCounter.print | grep -i codecache

计数器达到预留上限且从不回落,即可确认缓存已满;类加载器数量持续增长则提示生成的类在泄漏。

修复

扩容缓存并消除生成泄漏:

java -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing -jar app.jar

缓存动态代理、避免每请求新建类加载器,并限制运行时脚本。

验证

在持续负载下运行;告警不再出现,代码缓存计数器在新上限之下趋于平稳,吞吐保持稳定而不再劣化。