[JVM]四 执行引擎

文章目录

    • 执行引擎
    • 编译 & 执行
      • 为什么说java是半编译半解释:
      • 什么时候选择JIT
        • 热点探测
        • 回边计数
    • 执行方式
    • JIT分类

执行引擎

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

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

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

编译 & 执行

[JVM]四 执行引擎_第1张图片

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

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

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

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

[JVM]四 执行引擎_第2张图片

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

当程序启动后,解释器可以马上发会作用,省去编译的时间,立即执行,编译器想要发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后,执行效率高。
[JVM]四 执行引擎_第3张图片

什么时候选择JIT

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

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

热点探测

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

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

[JVM]四 执行引擎_第4张图片

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

回边计数

统计一个方法中循环体代码执行的次数
[JVM]四 执行引擎_第5张图片

执行方式

通过显示命令为java虚拟机指定运行时采取那种执行方式:
[JVM]四 执行引擎_第6张图片
-Xint:完全解释器执行
-Xcomp:完全即时编译
-Xmixed:混合执行

JIT分类

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

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

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

JDK10 Graal编译器 相对 G2

你可能感兴趣的:(JVM)