执行引擎

5. 执行引擎

5.1 执行引擎概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P52XnAhJ-1615101497506)(https://i.loli.net/2021/03/06/lNm6r57SHsMORt1.png)]

JVM的执行引擎的任务是将字节码指令/编译为对应平台上的本地机器指令才可以。就是将高级语言翻译为机器语言的译者。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtFwr9OE-1615101497508)(https://i.loli.net/2021/03/07/Va4TCvEpwn9fHYZ.png)]

5.2 java程序的编译和执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJnwma1Q-1615101497509)(https://i.loli.net/2021/03/06/cLsQPvi5wRObBTf.png)]

  • 解释器:当java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应平台的本地机器指令执行。

  • JIT编译器:虚拟机将源代码直接编译成和本地机器平台相关的机器语言。

java是半编译半解释型语言。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sU4mnYY-1615101497510)(https://i.loli.net/2021/03/07/TpCHridLKFR78nu.png)]

指令集:

  • x86指令集
  • arm指令集

字节码:是一种中间状态的二进制代码(文件),它比机器码更加抽象,需要直译器转译后才能成为机器码、字节码的实现需要通过编译器和虚拟机器。字节码主要是为了实现特定软件运行和软件环境、与硬件环境无关。

5.3 解释器

解释器将字节码文件中的内容翻译为对应的平台本地机器指令执行。

  • 字节码解释:效率很低下
  • 模板解释器:将每一条字节码和一个模板函数相关联,提高解释器的性能。

在Hotspot Vm中,解释器主要由 Interpreter模块和 Code模块构成

  • Interpreter模块:实现解释器的核心功能。
  • Code模块:管理Hotspot VM在运行时生成的本地机器指令

基于解释器的语言都会出现效率低下等问题。

5.4 JIT编译器

及时编译技术避免函数被解释执行,而是将整个函数体编译成机器码,每次函数执行的时候,只执行编译后的机器码即可。

Hotspot VM采用解释器和JIT编译器并存的架构。

为什么及时编译器的效率很高,Hotspot VM还是采用解释器和及时编译器并存的架构?

当虚拟机启动的时候,解释器就可以首先发挥作用,不必等待及时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。随着程序运行时间的推移,JIT编译器发挥作用,根据热点侦测功能,将有价值的字节码编译成本地指令,换取更高的程序执行效率。

热点代码侦测

热点代码:一个被调用多次的方法或者一个方法体内部循环次数较多的循环体都可以成为热点代码。

热点代码编译方式发生在方法的执行过程,称之为栈上替换(OSR编译)。

Hotspot VM采用的热点探测方式是基于计数器的热点探测。这个计数器包含着方法调用计数器回边计数器

  • 方法调用计数器:统计方法调用次数。默认是Client模式(1500次),Server模式(10000次),超过阈值就触发JIT编译。
    1. -XX:CompileThreshold设置阈值
    2. 当一个方法被调用时,先检查是否被JIT编译
  • 回边计数器:统计循环体执行次数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2VWMi6g-1615101497513)(https://i.loli.net/2021/03/07/O9z4TfJM6y2hqHo.png)]

命令显示指定采用解释器和及时编译器:

  • -Xint:完全采用解释器模式执行程序
  • -Xcomp:完全采用及时编译器模式执行程序,若出现问题,解释器会介入
  • -Xmixed:采用解释器+及时编译器的混合模式共同执行程序。(默认)

JIT编译器包含着两个编译器:Client Compiler和Server Compiler,但大部分情况下我们简称C1编译器和C2编译器,命令行可以显式指定JVM虚拟机运行使用哪一种即时编译器

  • -client:C1编译器:会对字节码进行简单和可靠的优化,耗时短,达到更快的编译速度
  • -server:C2编译器:耗时较长的优化以及激进优化,但优化的代码执行效率更高。

C1编译器上主要有方法内联、去虚拟化、冗余消除

C2编译器的优化主要在全局层面,逃逸分析是优化基础。主要有以下几种优化

  • 标量替换
  • 栈上分配
  • 同步消除

64位操作系统一般默认是C2编译器。

分层编译策略:程序解释执行触发C1编译(不开启性能监控),将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化。

在java7版本之后,一旦开发人员程序中显式指定命令-server时,默认开启分层编译策略。

在JDK10之后,Hotspot引入了一个全新的及时编译器:Graal编译器。使用 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler来激活。

AOT编译器(提前编译器):与JIT编译器是相对立的一个概念(在程序运行过程中,将字节码转化为可在硬件上直接运行的机器码,并部署至托管环境中的过程),AOT编译是指在程序运行之前就将字节码转化为机器码的过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值