同步操作将从 flatfish/Java-Review 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
执行引擎是Java虚拟机核心组件之一
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行的能力,其区别就是物理机的执行引擎是建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件的制约指令集和执行引擎的结构体系,能够执行哪些不被硬件直接支持的指令集格式。
JVM的主要任务是负责 装载字节码到其内部,但是字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表、以及其他辅助信息
那么如果想要一个Java程序运行起来,执行引擎(Execution Engine)的任务就是 将字节码指令解释/编译为对应平台的本地机器指令才可以,简单来说JVM的执行引擎充当了高级语言翻译为机器语言的译者
执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器
每当执行完一项指令操作之后,PC寄存器就会更新下一条需要被执行的指令的地址
当然方法在执行的过程中,执行引擎可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象的实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息
从外观上来看,所有的Java虚拟机的执行引擎的输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效流程,输出的是执行结果
编译过程又可以分为两个阶段:编译和汇编
Hotspot虚拟机是目前市面上高性能虚拟机的代表之一。它是采用解释器和即时编译器并存的架构,在其运行的时候,会找到解释器和即时编译器相互合作的节点。各自取长补短。
今天,Java的运行性能已经可以和C/C++程序一教高下的地步
既然Hotspot VM中已经内置了JIT编译器了,那么为啥还需要再使用解释器来“拖累”程序的执行性能呢?比如JRrockit VM 就不包含解释器,字节码全部依靠即时编译后执行 - 所以它号称最快的虚拟机
首先明确
概念解释
当然是否需要启动JIT编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用 执行的频率 而定。这样的被编译为本地代码的字节码,称为热点代码,JIT编译器再运行时会针对哪些被频繁调用的“热点代码”做出深度优化 将其直接编译为对应平台的本地机器指令,以提升Java程序的执行性能
一个被多次调用的方法,或者是一个方法体内部循环次数比较多的循环体都可以称为是热点代码,因此都可以通过JIT编译器翻译为本地机器指令,由于这种编译方式发生在方法的执行过程中,因此也被称为栈上替换。或者简称为 OSR(On Stack Replacement)
一个方法究竟要调用多少次,或者一个循环体究竟循环多少次,才会达到这个标准?肯定需要一个明确的阈值,JIT才会编译之为本地代码。这里主要依赖 热点探测功能
目前Hotspot VM 采用热点探测方式是基于计数器的热点探测
采用计数器的热点探测,Hotspot VM 将会为每一个方法都建立2个不同类型的计数器,分别为方法调用计数器,分别为方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter)
热度衰减
C1和C2编译器不同的优化策略
在不同的编译器上有不同的优化策略,
C1编译器有方法内联,去虚拟化、冗余消除
C2的优化主要是在全局层面,逃逸分析师优化的基础,基于逃逸分析在C2上有如下几种优化
分层编译(Tiered Compiler)策略
Graal编译器
AOT编译器
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。