-XX:+PrintCodeCache仅打印启动时Code Cache初始配置,无法定期监控;需通过JMX MBean、jstat -gccapacity计算使用率、GC/VM日志分析等手段实现巡检,并设75%预警线和90%熔断线。

-XX:+PrintCodeCache 是 JVM 启动参数,用于在 JVM 启动时打印当前 Code Cache 的初始配置(如初始大小、最大大小、启用的编译器等),但它不会持续输出运行时的使用情况,更不会“定期”打印。所以单靠这个参数无法实现线上系统的定期巡检或安全红线监控。
真正能用于巡检 Code Cache 使用率的方式
要掌握线上系统 Code Cache 的实时占用与趋势,需结合以下几种可靠手段:
-
JVM 运行时 MBean 接口:通过
com.sun.management:type=HotSpotCodeCacheBean获取Usage、Capacity、MaxCapacity等指标。可用 JMX 客户端(如 jconsole)、Prometheus + JMX Exporter 或自研 agent 定期采集。 -
jstat 工具定时采样:执行
jstat -compiler可查看已编译方法数和失效编译数;配合jstat -printcompilation观察编译状态变化。但更关键的是jstat -gccapacity中的CCSU(Code Cache Used)与CCCMX(Code Cache Max Capacity)字段,可算出使用率:CCSU / CCCMX * 100%。 -
GC 日志或 VM 日志增强:添加
-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:LogFile=jit.log可记录 JIT 编译详情;若 Code Cache 满导致编译被禁用,日志中会出现CompilerOracle: exclude或CodeCache is full类提示——这是触达红线的明确信号。
设定安全红线的合理阈值
Code Cache 耗尽会导致 JIT 编译器静默降级为解释执行,性能陡降且不可逆(除非重启)。因此建议按以下方式设防:
- 预警线设为 75%:触发告警,排查是否出现大量匿名类、动态代理、Groovy/JSR-223 脚本等易膨胀 Code Cache 的行为。
- 熔断线设为 90%:自动触发预案,例如关闭非核心模块的字节码增强、限制动态语言脚本加载、或通知运维准备滚动重启。
- 注意:JDK 8 默认 Code Cache 为 48MB,JDK 11+ 默认 240MB;若应用重度依赖反射或 CGLIB,应显式加大,如
-XX:ReservedCodeCacheSize=512m。
自动化巡检脚本示例(Linux + jstat)
可将以下逻辑封装为 cron 任务(如每5分钟执行一次):
#!/bin/bashpid=$(pgrep -f "java.*Application")
if [ -z "$pid" ]; then exit; fi
cc_used=$(jstat -gccapacity $pid | tail -1 | awk '{print $5}')
cc_max=$(jstat -gccapacity $pid | tail -1 | awk '{print $6}')
if [ "$cc_max" != "0" ]; then
rate=$((cc_used * 100 / cc_max))
if [ $rate -gt 75 ]; then
echo "$(date): CodeCache usage $rate% — WARN" >> /var/log/jvm/cc-alert.log
fi
fi










