[JVM]四 执行引擎

执行引擎

虚拟机的执行引擎是由软件实现,因此可以不受物理条件制约的定制指令与执行引擎的体系结构,能够执行那些不被硬件支持的指令集格式

jvm主要任务是负责装载字节码到内部,但字节码并不能直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,他内部包含的仅仅只是一些能够被JVM所识别的字节码指令,符号等,如果要想让一个java程序运行起来。执行引擎的任务就是将字节码指令解释编译为对应平台上的本地机器指令才可以,简单来说jvm中的执行引擎充当了高级语言与机器指令的翻译者。

执行引擎所执行的具体字节码指令依赖于pc寄存器

编译 & 执行

在这里插入图片描述

上图绿色路线:
解释:java虚拟机根据定义的规范对字节码采用逐行解释的方式执行

上图蓝色路线:
编译:JIT编译器,虚拟机将源码直接编译成本地机器平台相关的机器语言。避免了函数被解释执行,将整个函数体编译成机器码,使用热点缓存技术,提升了效率

为什么说java是半编译半解释:

JVM的执行引擎采用解释执行与编译执行二者结合并存的架构

在这里插入图片描述

解释器和即时编译器能相互协作,选择最适合的方式平衡程序执行的时间

当程序启动后,解释器可以马上发会作用,省去编译的时间,立即执行,编译器想要发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后,执行效率高。
生产环境发布过程的热机冷机状态承载流量不同造成宕机

什么时候选择JIT

根据代码被调用执行的频率,需要被编译成本地代码的字节码就被称为热点代码,对热点代码做出深度优化,将其直接编译为对应平台的机器指令,提升java程序的执行性能

一个被多次调用的方法,或者一个方法内部循环次数较多的循环体都可以被称为热点代码,通过JIT编译为本地机器指令,这种编译方式发生在放的执行过程中,因此也被称为站上替换

热点探测

HotSpot采用基于计数器的热点探测:
方法调用计数器:统计方法调用次数
回边计数器:统计循环体执行的循环次数

默认10000次。阈值可以通过-XX:CompileThreshold设定

在这里插入图片描述

热度衰减:
一段时间之内统计方法被调用的次数,如果一定的时间限制内方法调用次数没有达到阈值,计数器就会减少一半,称为计数器热度的衰减,这段时间就成为方法统计的半衰周期,惊醒热度衰减的动作实在虚拟机进行垃圾收集时顺便进行的,参数-XX:UseCounterDecay 关闭热度衰减,或-XX:CounterHalfLifeTime 设置半衰周期时间

回边计数

统计一个方法中循环体代码执行的次数
在这里插入图片描述

执行方式

通过显示命令为java虚拟机指定运行时采取那种执行方式:
在这里插入图片描述
-Xint:完全解释器执行
-Xcomp:完全即时编译
-Xmixed:混合执行

JIT分类

jvm运行在Client模式下使用C1编译器,
C1编译器对字节码进行简单可靠的优化,耗时短
C1采取的优化:方法内联,去虚拟化,冗余消除

JVm运行在Server(64位默认Server模式)模式下使用C2编译器
耗时长,激进优化,但代码执行效率更高
C2采取的优化:基于逃逸分析的标量替换,栈上分配。同步消除

JDK9 AOT编译器 相对 JIT
提前编译,预编译成二进制

JDK10 Graal编译器 相对 G2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值