JIT 编译后的代码存在哪?

Sherwin.Wei Lv8

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
2
size      245760   245760      CodeCacheMinimumFreeSpace
size 67108864 67108864 ReservedCodeCacheSize

手动调整 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