执行引擎
执行引擎也是JVM中的一个重要组成部分,JVM主要任务是装载字节码,但是字节码并不能直接运行在操作系统上,所以还需要一个可以将字节码翻译成操作系统认识的机器指令的组件,而这个组件就是执行引擎
工作过程
当执行完一条指令后,程序计数器就会更新下一条需要被执行的指令地址,在方法执行过程中,执行引擎也可能会通过存储在局部变量表中的对象引用准确定位到存储在java堆区中的对象实例信息以及通过对象头中的元数据指针定位到目标对象的类型信息
可以看到java中既有解释器又有编译器,所以java被称为半编译半解释型语言
字节码解释器 当JVM启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应平台的本地机器指令
JIT(Just In Time)编译器(即时编译器) 虚拟机将源代码直接编译成与本地机器平台相关的机器语言
由于解释器太过于低效,所以JVM中支持了即时编译器,即时编译的目的是避免函数被解释执行,而是将整个函数体编译为机器码,每次函数执行时,只执行编译后的机器码即可,这样可以大幅度的提升执行效率
那么为什么JIT编译器执行效率高还要使用解释器呢?
这是因为解释器在程序启动的时候就可以马上开始执行,不需要编译,而编译器需要先将代码编译为本地代码,然后在进行执行,所以两者都存在,就可以使得在虚拟机启动的时候,解释器先发挥作用,不必等待即时编译器全部编译完成再执行,这样可以省去不必要的编译时间,后续即时编译器才会逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,换取更高的执行效率
设置程序执行方式
Hotspot默认使用的是解释器+即时编译器并存的架构
1 | java -version |
-Xint
只使用解释器的执行程序
-Xcomp
只使用即时编译器执行程序
-Xmixed
采用解释器+即时编译器的混合模式