JVM(五)-- 执行引擎
目录
前言
一、概述
二、Java代码编译和执行的过程
1. 解释器
2. JIT编译器
3. JIT分类
三、总结
前言
一、概述
二、Java代码编译和执行的过程
可以把 javac
编译(源代码 -> 字节码)理解为“前端编译”,而 JIT 编译(字节码 -> 机器码)则是“运行时编译”或“后端编译”。两者分工明确,JIT 编译器的工作对象始终是字节码。
解释器和JIT编译器虽然都负责将字节码转换为机器指令,但它们在工作原理、性能特点和适用场景上有着本质的区别。两者的区别如下表所示:
特性维度 | 解释器 (Interpreter) | JIT 编译器 (Just-In-Time Compiler) |
---|---|---|
执行方式 | 逐条解释执行字节码,翻译一条执行一条 | 将热点代码整体编译为本地机器码后执行 |
编译时机 | 运行时边解释边执行 | 运行时进行编译(热点代码达到阈值后) |
执行速度 | 较慢(每次执行都需翻译) | 编译后执行速度快(直接执行机器码) |
启动速度 | 快(无需编译过程) | 相对较慢(需要预热和编译时间) |
内存占用 | 较低(不存储编译结果) | 较高(需存储编译后的机器码) |
代码优化 | 无或少量优化 | 进行深度优化(如内联、逃逸分析等) |
应用场景 | 启动阶段、执行次数少的代码 | 频繁执行的热点代码(如循环、高频方法) |
1. 解释器
2. JIT编译器
HotSpot虚拟机采用解释器与JIT编译器并存的架构。
当然是否需要启动JIT编译器将字节码直接编译为本地机器指令,则需要根据代码被调用执行的频率而定。那些需要被编译为本地代码的字节码,也被称为“热点代码”,JIT编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为本地机器指令,以提升Java程序的执行性能。
Java方法执行过程如下图所示:
首先看该方法是否已被JIT进行编译,若被编译,则直接执行编译之后的机器码;如果没有,则方法调用计数器加1,如果超过阈值,JIT解释器就进行编译,然后将编译结果放到代码缓存区中。如果没有超过阈值,则利用解释器一行一行进行解释执行。
3. JIT分类
总结:
1.一般来说,JIT编译出来的机器码性能比解释器要高
2. C2编译器的启动时长比C1编译器慢,但系统稳定执行之后,C2编译器执行速度远远快于C1编译器。
三、总结
关于执行引擎可以用下面这个图来进行概括: