JVM 执行引擎架构
理解执行引擎的架构,是深入理解 JIT 编译的基础。
执行方式
Java 代码有多种执行方式:
解释执行
解释执行逐条读取字节码指令并翻译成机器码执行:
- 优点:启动快,无需等待编译
- 缺点:执行速度慢,每次调用都需要解释
JIT 编译
JIT(Just-In-Time)编译器在运行时将热点字节码编译成机器码:
- 优点:编译后的代码执行速度快
- 缺点:需要预热时间,编译本身消耗资源
AOT 编译
AOT(Ahead-of-Time)编译在程序运行前将字节码编译成机器码:
- 优点:无需预热,启动快
- 缺点:无法利用运行时信息做激进优化
HotSpot VM 架构
HotSpot VM 是目前最主流的 JVM 实现:
解释器
解释器逐条执行字节码指令:
JIT 编译器
HotSpot VM 包含两个 JIT 编译器:
分层编译
现代 JVM 采用分层编译策略:
执行引擎的协作
JIT 编译器的作用
JIT 编译器的主要作用:
- 提升执行速度:编译后的机器码比解释执行快 10~100 倍
- 激进优化:利用运行时信息进行深度优化
- 去优化:在优化假设不成立时回退到解释执行
代码缓存
编译后的机器码存储在代码缓存(Code Cache)中:
如果代码缓存满了,JIT 编译器会停止工作:
性能影响
不同执行方式的性能对比: