症状
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
缓存动态代理、避免每请求新建类加载器,并限制运行时脚本。
验证
在持续负载下运行;告警不再出现,代码缓存计数器在新上限之下趋于平稳,吞吐保持稳定而不再劣化。