执行引擎概述

1.执行引擎是Java虚拟机核心的组成部分之一
2.虚拟机是相对于”物理机”的概念,这两个机器都有代码执行,其区别是物理机的执行引擎是直接建立在处理器,缓存,指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件实现的,因为可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不受硬件直接支持的指令集格式.
3.JVM的主要任务是负责装载字节码到内部,而执行引擎的任务则是将字节码解释/编译为对应平台的本地机器指令(即机器码).

执行引擎的工作过程

第一步:执行引擎在执行的过程中究竟需要执行什么样的的字节码指令完全依赖于pc计数器;
第二步:每当执行完一项指令操作以后,pc寄存器就会更新下一条需要被执行的指令地址;
第三步:当然方法在执行过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息

Java代码编译和执行的过程

image.png
image.png
image.png

什么是解释器(Interpreter),什么是JIT编译器?

当Java虚拟机启动时会根据预定义的规划对字节码采用逐行解释的方式执行,将每条字节码文件中的内容”解释”为对应平台的本地机器指令来执行;
JIT(Just In Time Compiler)编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言

为什么说Java是半编译半解释型语言?

因为现在的Java虚拟机在执行java代码的时候,通常都会将解释执行和编译执行二者结合起来进行,其中的编译器即为我们的JIT即是编译器.

解释器

image.png
解释器:即将字节码中的内容”翻译”成对应平台的本地机器指令执行
发展历程:从字节码解释器——————->模板解释器
其中字节码解释器执行时通过纯软件代码模拟字节码的执行,效率比较低
而模板解释器则是将每一条字节码和一个模板函数相关联,模板函数中直接产生这个字节码的机器码,从而很大程度上提高了解释器的性能
在HotSpot VM中,解释器主要有Interpreter模块和Code模块构成
Interpreter模块:实现了解释器的核心功能
Code模块:用来管理HotSpot VM运行时生成的本地机器指令

JIT编译器

解释器是通过拿到源代码编译成的字节码文件,将其逐行解释转换成机器码执行;
而这里的JIT即时编译器则是编译执行(直接编译成机器码)
HotSpot VM 采用则是解释器和即时编译器并存的架构;在Java虚拟机运行时,解释器和及时编译器能够相互协作,各自取长补短,尽力选择最合适的方式来权衡编译本地代码的时间和直接解释执行代码的时间.
image.png
image.png
image.png

总结:

1.一般来说,JIT即时编译出来的机器码性能比解释器要高
2.C2编译器启动时长比C1编译器慢,但是,当系统稳定执行以后,C2编译器的执行速度远远快于C1编译器

HotSpot VM已经内置了即时编译器JIT,为什么还需要再使用解释器”拖累”程序的执行性能呢?

image.png