JIT 编译后的代码存在哪?
JIT 编译后的代码存在哪?
回答重点
JIT(Just-In-Time)编译后的机器码通常存放在 Code Cache(代码缓存区,不在堆内) 中。
JVM 提供参数用于调整 Code Cache 的大小和行为:
-XX:InitialCodeCacheSize:初始大小。-XX:ReservedCodeCacheSize:最大大小。-XX:+PrintCodeCache:打印 Code Cache 信息。
扩展知识
什么是 Java 中的 JIT?
Code Cache 的特点
1)固定大小:
- Code Cache 的大小由 JVM 参数配置,通常有一个最大值。
- 默认大小依赖于 JVM 版本和运行环境(例如,HotSpot JVM 在 Java 8 中默认大小约为 48MB)。
2)分层结构:
Java 8 中引入了分层编译(Tiered Compilation),Code Cache 可能分为多个区域,分别存储不同级别的编译代码:
- 非方法代码(Non-method Code):存储运行时的 JVM 调试代码或模板代码。
- 方法代码(Method Code):存储普通 JIT 编译的代码。
- 轮廓代码(Profiled Code):存储优化级别更高的代码。
Code Cache 的参数配置
使用以下命令查看 Code Cache 的默认配置:
1 | java -XX:+PrintFlagsFinal -version | grep CodeCache |
输出示例:
1 | size 245760 245760 CodeCacheMinimumFreeSpace |
手动调整 Code Cache 的大小,例如:
1 | java -XX:ReservedCodeCacheSize=128m -XX:InitialCodeCacheSize=32m -jar app.jar |
当看到下面的日志时候,说明Code Cache 大小不足了,此时 JIT 编译已经被禁用,应用性能会下降(尚未被编译的代码只能以解释方式执行),这时候需要手动调整 Code Cache 的大小。
1 | Server VM warning: CodeCache is full. Compiler has been disabled. |
Comments