执行引擎
执行引擎
概述
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
编译和执行的过程
Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:
- JIT编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。
- 解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
缺省情况下HotSpot VM是采用解释器与即时编译器并存的架构,当然开发人员可以根据具体的应用场景,通过命令显式地为Java虚拟机指定在运行时到底是完全采用解释器执行,还是完全采用即时编译器执行。如下所示:
- -Xint:完全采用解释器模式执行程序。
- -Xcomp:完全采用即时编译器模式执行程序。如果即时编译出现问题,解释器会介入执行。
- -Xmixed:采用解释器+即时编译器的混合模式共同执行程序。
在HotSpot VM中内嵌有两个JIT编译器,分别为client Compiler和serverCompiler,但大多数情况下我们简称为c1编译器和c2编译器。
- -client:指定Java虚拟机运行在client模式下,并使用c1编译器。c1编译器会对字节码进行简单和可靠的优化,耗时短。以达到更快的编译速度。
- -server:指定Java虚拟机运行在server模式下并使用C2编译器。C2进行耗时较长的优化,以及激进优化。但优化的代码执行效率更高。
Java是半编译半解释型语言。现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。因为解释器相对来说比较低效,为了提高性能使用JIT编译器,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。来缓存热点代码。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论