JVM之执行引擎详解

JVM之执行引擎详解

一 执行引擎概述

  1. 执行引擎概述
    JVM之执行引擎详解_第1张图片
    (1) 物理机的执行引擎是直接建立在处理器、缓存、指令集合操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,能够执行那些不被硬件直接支持的指令集格式
    (2)执行引擎的任务是将字节码指令解释编译为对应平台上的本地机器指令来让一个Java程序运行起来,使之在操作系统上直接运行
    JVM之执行引擎详解_第2张图片
  2. 执行引擎的工作过程
    JVM之执行引擎详解_第3张图片
    (1)执行引擎在执行什么样的字节码指令完全依赖PC寄存器
    (2)每执行完一项指令操作后,PC寄存器机会更新下一条需要被执行的指令地址
    (3)方法在执行的过程中,执行引擎可能会通过储存在局部变量表中的对象引用准确定位到储存在Java堆区中的对象实例信息以及通过对象头中的元数据指针定位到目标对象的类型信息
    JVM之执行引擎详解_第4张图片

二 Java程序的编译和解释运行

  1. Java代码编译和执行的过程
    Java字节码的执行是由JVM执行引擎完成,流程图如下:
    JVM之执行引擎详解_第5张图片
    (1)解释器:Java虚拟机启动时根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应平台的本地机器指令执行
    (2)JIT编译器:虚拟机将源代码直接编译成和本地机器平台相关的机器语言
    (3)HotSpot VM 采用解释器和及时编译器并存的架构,在Java虚拟机运行时,解释器和即时编译器能够相互协作,选择最合适的方式来权衡编译本地代码的时间和直接解释执行代码的时间
    (4)当Java虚拟机启动时,解释器可以首先发挥作用,不必等待即时编译器全部编译完成后再执行,这样可以省去许多不必要的编译时间,随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,获得更高的执行效率
    JVM之执行引擎详解_第6张图片
  2. JIT即时编译器探测方式
    (1)需要被编译为本地代码的字节码也被称为热点代码,根据代码被调用执行的频率觉得是否需要启动JIT编译器,JIT编译器会对热点代码进行深度优化,将其直接编译为对应平台的本地机器指令
    (2)一个被多次调用的方法或者是一个方法内部循环次数较多的循环体都可以被称为热点代码,可以被JIT编译器编译为本地机器指令,由于这种方式发生在方法的执行过程中,也被称为栈上替换,简称OSR编译。
    (3)HotSpot VM采用的热点探索方式是基于计数器的热点探测,为每一个方法建立两个不同类型的计数器,分别为方法调用计数器和回边计数器,其中方法调用计数器用于统计方法的调用次数,回边计数器用于统计循环体执行的循环次数
    (4)方法调用计数器流程
    这个计数器的默认阙值在Client下是1500次,在Server模式是1000次,超过这个值就会触发JIT编译
    热度衰减:方法调用计数器统计的并不是方法调用的绝对次数,而是一个相对的执行频率,及一段时间之内方法被调用的次数,当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那这个方法的调用计数器就会减少一半,这个过程称为方法调用计数器热度的衰减,这段时间就称为方法统计的半衰周期
    JVM之执行引擎详解_第7张图片
    (5)回边计数器
    统计一个方法中循环体代码执行的次数,在字节码遇到控制流向后跳转的指令称为回边,其目的就是为了触发OSR编译
    JVM之执行引擎详解_第8张图片
  3. HotSpot设置模式C1和C2编辑器
    (1)解释器和编译器模式转换及混合
    -Xint 纯解释器
    -Xcomp 纯编译器
    -Xmixed 混合,时间最快
    JVM之执行引擎详解_第9张图片
    (2)JIT分类
    -client:指定Java虚拟机运行在client模式下,使用C1编译器,C1编译器会对字节码进行简单和靠的优化,耗时短
    -server:指定Java虚拟机运行在server模式下,使用C2编译器,C2进行耗时较长的优化以及激进优化
  4. C1和C2编译器优化策略
    (1)C1编译器主要有方法内联、去虚拟化、冗余消除
    ① 方法内联:将引用的函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程
    ② 去虚拟化:对唯一的实现类进行内联
    ③ 冗余消除:在运行期间把一些不会执行的代码折叠掉
    (2)C2优化主要在全局层面,逃逸分析是优化的基础
    标量替换:用标量值代替聚合对象的属性值
    栈上分配:对于为逃逸的对象分配对象在栈上而不是堆上
    同步消除:清除同步操作,通常指synchronized
    (3)分层编译策略
    程序解释执行可以出发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化

你可能感兴趣的:(JVM学习笔记,执行引擎,JVM)