执行引擎篇
执行引擎的作用
执行引擎是将字节码通过编译/解释的方式将字节码指令翻译为 CPU 能够执行的机器码指令
执行引擎是怎么工作的?
- 执行引擎在执行的过程中究竟需要执行什么样的字节码指令,完全依赖于 PC 寄存器
- 每当执行完一项指令操作后,PC 寄存器就会更新下一条需要被执行的指令地址
- 在方法的执行过程中,执行引擎可能会通过存储在局部变量表中的对象引用准确定位到存储在 Java 堆区中的对象信息,进一步定义到方法区中的类元信息
代码编译和执行的过程
解释器
JVM 设计者们的初衷仅仅是单纯地为了满足 Java 程序实现跨平台特性,因此避免采用静态编译地方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码程序的想法。
编译器
为什么说 Java 是半编译半解释型语言
AOP 编译器
Ahead of Time Compiler (AOT),在程序运行之前就将字节码转换为机器码。
Java 9 实验性地引入了 AOT 编译器,但最终并没有替代 JIT 编译器,因为这破坏了 “一次编译,到处运行” ,降低了 Java 链接过程的动态性
JIT 编译器
在 HotSpot JVM 中内嵌有两个 JIT 编译器,分别为 Client Compiler 和 Server Compiler,简称 C1 编译器和 C2 编译器。
-client
: 指定 C1 编译器作为 JIT 编译器- C1 编译器会对字节码进行简单和可靠的优化,耗时短,以达到更快的编译速度
- C1 启动快,占用内存小,执行效率没有 C2 快,默认情况下不进行动态编译,适用于桌面应用程序
-server
: 指定 C2 编译器作为 JIT 编译器- C2 进行耗时较长的优化,以及激进优化,但优化的代码执行效率更高
- C2 启动慢,占用内存多,执行效率高,适用于服务器端应用