这是我参与更文挑战的第 7 天,活动详情查看: 更文挑战
执行引擎
1.执行引擎概述
执行引擎是Java虚拟机核心组件之一。虚拟机的执行引擎是由软件自行实现的,可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
JVM主要任务是装载字节码到内存中,但是字节码并不能直接运行在操作系统上,如果想要一个字节码运行起来,需要一个执行引擎将字节码指令解释或者编译为对应平台的机器指令才可以。
执行引擎工作过程:
- 执行引擎需要执行什么指令完全依赖于PC寄存器
- 执行完一条指令后,PC寄存器就会更新下一条需要被执行的指令。
- 执行引擎可以通过存储在局部变量表中的对象引用准确定位到堆区的对象实例信息。
2.编译和解释运行的过程
什么是解释器?
解释器:当Java虚拟机启动时预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应的机器指令执行。
什么是JIT(编译器)?
编译器:就是虚拟机将源代码直接编译为本地的机器语言。
为什么说Java是半编译半解释型语言?
执行引擎去解析字节码文件时既可以使用解释器也可以使用即时编译器,JVM在执行代码时通常会将编译器和解释器二者结合起来进行。通过即时编译器可以把字节码指令缓存到方法区的JIT缓存区中,如果频繁调用就可以直接调用这个指令。
解释器和编译器执行过程:
3.解释器
解释器主要的承担的责任就是一个运行时翻译者,将字节码文件的内容翻译成对应平台的机器指令。
由于解释器的效率低下,Java支持了一种叫作即时编译器的技术。即时编译器的目的就是避免函数被解释执行,而是将整个函数体编译为机器码,每次函数执行时,只执行编译后的机器码即可,执行效率大幅提升。
既然Java有了即时编译器(JIT)为什么还要由解释器的存在?
解释器虽然整体效率低下,需要逐行逐行的解析,但是解释器响应速度快,在程序启动后,解释器可以立马发挥作用,省去了编译的时间。编译器想要发挥作用,要先把代码编译成本地代码,需要一定的执行时间,但是等翻译本地代码后,执行效率更高。同时解释执行再编译器进行激进优化不成立的时候,作为编译器的逃生门。
HotSpot 虚拟机执行的方式:
当虚拟机启动时,解释器可以首先发挥功能,而不是等待即时编译器全部编译完成再执行,这样可以省去不必要的编译时间,并且随着程序的运行时间推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的代码编译为本地机器指令,以换取更高效的程序执行效率。