八、执行引擎

概述

  • 是java虚拟机核心组成部分之一
  • 执行引擎是由软件自行实现,可以不收物理条件制约的定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式
  • JVM的主要任务时复制装载字节码到其内部,但字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,内部包含的仅仅只是被JVM所识别的字节码指令,符号表,以及其他辅助信息
  • 执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令.充当了高级语言翻译为机器语言的译者

工作过程

输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果

  1. 执行引擎在执行的过程中需要执行什么样的字节码指令完全依赖于PC寄存器
  2. 每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址
  3. 当方法在执行过程中,执行引擎有可能通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,以及通过对象头中的原数据指针定位到目标对象的类型信息
    在这里插入图片描述

Java代码编译

大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经过下图中的各个步骤

在这里插入图片描述

java代码编译是由Java源码编译器来完成,流程如下

在这里插入图片描述

Java字节码的执行是由JVM执行引擎来完成,流程如下

在这里插入图片描述

解释器

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

JIT编译器

就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言

Java是半编译半解释型语言

JDK1.0时代,将Java语言定位为"解释执行"还是比较准确的,再后来,java也发展出可以直接生成本地代码的编译器.现在JVM在执行Java代码的时候,通常会将解释执行与编译执行二者结合起来进行

在这里插入图片描述

字节码

  • 字节码是一种中间状态的二进制文件,比机器码更抽象,需要直译器转译后才能成为机器码
  • 主要为了实现特定软件运行和软件环境,与应急环境无关
  • 字节码的实现方式通过编译器和虚拟机器.编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令

解释器

JVM设计者初衷只是为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,实现解释器在运行时采用逐行解释字节码执行器的想法

  • 解释器真正意义上锁承担的角色就是一个运行时翻译组,将字节码文件中的内容翻译为对应平台的本地机器指令执行
  • 当一条字节码指令被解释执行完成后,在根据PC寄存器中记录的下一条需要执行的字节码指令执行解释操作

JIT编译器

即时编译技术

即时编译的目的是避免函数被解释执行,而是将整个函数体编译成机器码,每次函数执行时,只执行编译后的机器码即可.这种执行效率大幅度提升

Hotspot VM 采用解释器与即时编译器并存的架构

  • 在Java虚拟机运行时,解释器和即时编译器能够互相协作,各自取长补短,尽力去选择最合适的方式来权衡编译本地代码的时间和直接解释执行代码的时间
  • 当程序启动后,解释器可以马上发挥作用,省去编译的时间,立即执行.而编译器还需要吧代码编译成本地代码,需要一定的编译时间.编译完成后执行效率高
  • 所以当Java虚拟机启动时,解释器可以先发挥作用,不必等待即时编译器全部编译完成后再执行,这样可以省去许多不必要的编译时间.随着运行时间推移,根据热点探测功能, 编译器把越来越多有价值的代码编译成本地机器指令后,获得更高的执行效率.同时,在编译器优化不成立的时候,可以回退为解析器执行.

热点代码

  • 一个被多次调用的方法或者是方法体内部循环多次的循环体都可以被称为热点代码
  • 目前Hotspot所采用的的热点探测方式是基于计数器的热点探测
  • 循环调用的阈值server模式(默认)下为10000次,超过这个阈值就会触发JIT编译

在这里插入图片描述

热点衰减

  • 方法调用计数器统计的并不是方法被调用的绝对次数,二十一个相对的执行频率,在一段时间内方法被调用的次数,超过一定时间限度,调用的次数仍未达到阈值,该计数器就减半,该过程称为衰减,这段时间称为半衰周期
  • -XX:UseCounterDecay 关闭热度衰减 -XX:CounterHalfLifeTime 半衰周期时间设置,单位秒

Hotspot设置执行方式

  • 默认采用解释器与即时编译器并存的架构
  • -Xint: 完全采用解释器模式执行
  • -Xcomp : 完全采用编译器模式执行,如果即时编译器出现问题,解释器会介入执行
  • -Xmixed : 默认方式,解释器+即时编译器共同执行

Hotspot VM中JIT分类

  • -client(c1编译器): 对字节码进行简单和可靠的优化,耗时段,达到更快的编译速度
  • -server(c2编译器) 耗时较长,激进优化,优化后的代码执行效率更高

C1和C2编辑器优化策略

  • C1编辑器上主要有方法内联,去虚拟化,冗余消除
    • 方法内联: 将引用的函数代码编译到引用点处,减少栈帧的生成和参数传递以及跳转过程
    • 去虚拟化: 对唯一的实现类进行内联
    • 冗余消除: 在运行期间把一些不会执行的代码折叠
  • C2的优化主要是在全局层面上,逃逸分析是优化的基础,基于逃逸分析在C2上有如下几种优化
    • 标量替换: 用标量值代替聚合对象的属性值
    • 栈上分配: 对于为逃逸的对象分配对象在栈而不是堆
    • 同步消除: 清除同步操作,通常指synchronized
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值