1. CodeCache简介
JVM中的CodeCache是专门用于存储由JIT(即时编译器)编译生成的本地机器代码的内存区域。JIT编译器会将热点方法编译为本地代码,以提升程序运行效率。这些编译后的代码会被存储在CodeCache中,以便后续调用时直接执行,无需再次解释或编译。
1. 什么是“热点方法”?
在JVM(Java虚拟机)中,“热点方法”指的是被频繁调用或执行次数较多的方法。JVM会通过统计方法的调用次数、执行时间等指标,动态判定哪些方法属于“热点”。
2. 编译为本地代码的含义
Java程序最初是以字节码(.class文件)形式运行在JVM上,由解释器逐条解释执行。但解释执行效率较低。为提升性能,JVM内置了JIT(Just-In-Time,即时编译器),它会将热点方法的字节码编译为本地机器代码(native code),即直接由操作系统和CPU执行的二进制指令。 本地代码:指的是针对当前操作系统和CPU架构优化过的、可直接运行的低级指令代码。
3. 编译过程简述
- 启动阶段:所有方法都由解释器解释执行。
- 热点探测:JVM统计每个方法的调用频率,发现某些方法成为“热点”。
- JIT编译:JIT编译器将这些热点方法的字节码翻译成本地机器代码,并存储在CodeCache中。
- 后续调用:再次调用这些方法时,JVM直接执行本地代码,无需解释,速度大幅提升。
4. 优势
- 性能提升:本地代码运行速度远高于字节码解释执行。
- 动态优化:JIT编译器可以根据运行时数据做出更有针对性的优化。
2. CodeCache主要指标
JVM通常会通过各种监控工具(如JMX、jstat、VisualVM等)暴露CodeCache相关指标,主要包括:
- CodeCache使用量(used)
- 表示当前已经被JIT编译器使用的CodeCache空间大小(单位:字节或MB)。
- CodeCache总容量(capacity/committed)
- 表示当前JVM为CodeCache分配的总内存空间(单位:字节或MB)。
- CodeCache最大容量(max)
- JVM允许分配给CodeCache的最大空间(单位:字节或MB),由参数
-XX:ReservedCodeCacheSize控制。
- JVM允许分配给CodeCache的最大空间(单位:字节或MB),由参数
- CodeCache剩余空间(free)
- 当前未被使用的CodeCache空间。
- CodeCache使用率
- 使用量与总容量的百分比,用于判断CodeCache是否接近耗尽。
3. 相关JVM参数
-XX:InitialCodeCacheSize:设置CodeCache的初始大小。-XX:ReservedCodeCacheSize:设置CodeCache的最大大小。-XX:CodeCacheMinFreeSpace:设置CodeCache的最小剩余空间,低于该值时会限制JIT编译。
4. 监控和管理建议
- 监控CodeCache使用率:当CodeCache空间耗尽时,JVM会停止JIT编译,导致性能下降,甚至出现
CodeCache is full的警告或错误。 - 调整参数:根据实际应用需求和JIT编译情况,合理调整相关参数,避免CodeCache过小或过大。
5. 常用查询方式
- 使用
jstat -compiler <pid>可以查看CodeCache的当前状态。 - 通过JMX的
java.lang:type=CodeCacheManager或java.nio:type=CodeCache等Bean获取详细指标。