执行引擎
# 执行引擎
# 执行引擎工作过程

- 执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于 PC 寄存器。
- 每当执行完一项指令操作后,PC 寄存器就会更新下一条需要被执行的指令地址。
- 当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在 Java 堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息。
为什么说 Java 是半编译半解释型语言?


# 解释器
事实上,计算机并不认识高级语言,在执行过程中我们会把高级语言转换成计算机所能理解的一种中间格式(如汇编语言),然后才能理解计算机如何解释和执行这些中间的程序,以及系统的哪一部分影响程序的执行效率。


现状:由于解释器在设计和实现上非常简单,因此除了 Java 语言之外,还有许多高级语言同样也是基于解释器执行的,比如 Python、Perl、Ruby 等。但是在今天,基于解释器执行已经沦落为低效的代名词,并且时常被一些 C/C++ 程序员所调侃。
# 编译器
Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程。
- 因为它可能是指一个前端编译器(其实叫 “编译器的前端” 更准确一些)把 .java 文件转变成 .class 文件的过程;
- 也可能是指虚拟机的后端运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程。
- 还可能是指使用静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把.java 文件编译成本地机器代码的过程。
HotSpot VM 是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。
如何选择?
当然是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。关于那些需要被编译为本地代码的字节码,也被称之为 **“热点代码”**,JIT 编译器在运行时会针对那些频繁被调用的 “热点代码” 做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。
- 方法调用计数器

- 回边计数器

问题来了!有些开发人员会感觉到诧异,既然 HotSpot VM 中已经内置 JIT 编译器了,那么为什么还需要再使用解释器来 “拖累” 程序的执行性能呢?

# 指令

java -versionjava -Xint -versionjava -Xcomp -version
编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48