当前位置:网站首页>《JVM系列》 第七章 -- 字节码执行引擎
《JVM系列》 第七章 -- 字节码执行引擎
2022-04-23 14:33:00 【InfoQ】
- 各种用二进制编码方式表示的指令,叫做机器指令码。开始,人们就用它采编写程序,这就是机器语言。
- 机器语言虽然能够被计算机理解和接受,但和人们的语言差别太大,不易被人们理解和记忆,并且用它编程容易出差错。
- 用它编写的程序一经输入计算机,CPU直接读取运行,因此和其他语言编的程序相比,执行速度最快。
- 机器指令与CPU紧密相关,所以不同种类的CPU所对应的机器指令也就不同。
- 由于机器码是有0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。
- 指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov,inc等),可读性稍好
- 由于不同的硬件平台,执行同一个操作,对应的机器码可能不同,所以不同的硬件平台的同一种指令(比如mov),对应的机器码也可能不同。
- 不同的硬件平台,各自支持的指令,是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集。
- 如常见的:x86指令集,对应的是x86架构的平台、ARM指令集,对应的是ARM架构的平台
- 由于指令的可读性还是太差,于是人们又发明了汇编语言。
- 在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的硬件平台,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
- 由于计算机只认识指令码,所以用汇编语言编写的程序还必须翻译成机器指令码,计算机才能识别和执行。
- 为了使计算机用户编程序更容易些,后来就出现了各种高级计算机语言。
- 高级语言比机器语言、汇编语言更接近人的语言当计算机执行高级语言编写的程序时,仍然需要把程序解释和编译成机器的指令码。完成这个过程的程序就叫做解释程序或编译程序。
- 高级语言也不是直接翻译成 机器指令,而是翻译成汇编语言吗,如下面说的C和C++
- 编译过程又可以分成两个阶段:编译和汇编。
- 编译过程:是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码
- 汇编过程:实际上指把汇编语言代码翻译成目标机器指令的过程。
- 字节码是一种中间状态(中间码)的二进制代码(文件),它比机器码更抽象,需要直译器转译后才能成为机器码
- 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。
- 字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。
- 字节码典型的应用为:Java bytecode
- 字节码解释器在执行时通过纯软件代码模拟字节码的执行,效率非常低下。
- 模板解释器将每一条字节码和一个模板函数相关联,模板函数中直接产生这条字节码执行时的机器码,从而很大程度上提高了解释器的性能。
- Interpreter模块:实现了解释器的核心功能
- Code模块:用于管理HotSpot VM在运行时生成的本地机器指令
- 第一种是将源代码编译成字节码文件,然后在运行时通过解释器将字节码文件转为机器码执行
- 第二种是编译执行(直接编译成机器码)。现代虚拟机为了提高执行效率,会使用即时编译技术(JIT,Just In Time)将方法编译成机器码后再执行
- Java 语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把.java文件转变成.class文件的过程;
- 也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程。
- 还可能是指使用静态提前编译器(AOT编译器,Ahead of Time Compiler)直接把.java文件编译成本地机器代码的过程。
- Java 9引入了实验性AOT编译工具aotc。它借助了Graal编译器,将所输入的Java类文件转换为机器码,并存放至生成的动态共享库之中。>.java -> .class -> (使用jaotc) -> .so
- 好处:Java虚拟机加载已经预编译成二进制库,可以直接执行。不必等待及时编译器的预热,减少Java应用给人带来“第一次运行慢” 的不良体验
- 缺点:破坏了 java “ 一次编译,到处运行”,必须为每个不同的硬件,OS编译对应的发行包。降低了Java链接过程的动态性,加载的代码在编译器就必须全部已知。还需要继续优化中,最初只支持Linux X64 java base
- 一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”,因此都可以通过JIT编译器编译为本地机器指令。由于这种编译方式发生在方法的执行过程中,因此被称之为栈上替换,或简称为OSR(On Stack Replacement)编译。
- 一个方法究竟要被调用多少次,或者一个循环体究竟需要执行多少次循环才可以达到这个标准?必然需要一个明确的阈值,JIT编译器才会将这些“热点代码”编译为本地机器指令执行。这里主要依靠热点探测功能。
- 目前HotSpot VM所采用的热点探测方式是基于计数器的热点探测。
- 采用基于计数器的热点探测,HotSpot V将会为每一个方法都建立2个不同类型的计数器,分别为方法调用计数器(Invocation Counter)用于统计方法的调用次数和回边计数器(Back Edge Counter)用于统计循环体执行的循环次数。
- 这个计数器就用于统计方法被调用的次数,它的默认阀值在Client模式下是1500次,在Server模式下是10000次。超过这个阈值,就会触发JIT编译。
- 这个阀值可以通过虚拟机参数-XX:CompileThreshold来设定。
- 当一个方法被调用时,会先检查该方法是否存在被JIT编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将此方法的调用计数器值加1,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阀值。如果已超过阈值,那么将会向即时编译器提交一个该方法的代码编译请求。
版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/2441a148cb0338862b7fec9f5
边栏推荐
- Unity_代码方式添加绑定按钮点击事件
- 交通灯系统51单片机设计(附Proteus仿真、C程序、原理图及PCB、论文等全套资料)
- 1分钟看懂执行流程,永久掌握for循环(附for循环案例)
- redis的五种数据类型
- 51 MCU flowers, farmland automatic irrigation system development, proteus simulation, schematic diagram and C code
- Eight way responder system 51 Single Chip Microcomputer Design [with Proteus simulation, C program, schematic diagram, PCB files, component list and papers, etc.]
- QT actual combat: Yunxi chat room
- Detailed explanation of C language P2 selection branch statement
- Tongxin UOS php7 2.3 upgrade to php7.0 two point two four
- 8.4 循环神经网络从零实现
猜你喜欢
Qt实战:云曦聊天室篇
八路抢答器系统51单片机设计【附Proteus仿真、C程序、原理图及PCB文件、元器件清单和论文等】
KVM learning resources
基于TLC5615的多路可调数控直流稳压电源,51单片机,含Proteus仿真和C代码等
Notes on Visio drawing topology
【Servlet】Servlet 详解(使用+原理)
Detailed explanation of C language knowledge points -- first knowledge of C language [1]
8.4 循环神经网络从零实现
8.2 文本预处理
Proteus simulation design of four storey and eight storey elevator control system, 51 single chip microcomputer, with simulation and keil c code
随机推荐
ASEMI超快恢复二极管与肖特基二极管可以互换吗
8.3 语言模型与数据集
Solve the problem of SSH configuration file optimization and slow connection
A blog allows you to learn how to write markdown on vscode
1 minute to understand the execution process and permanently master the for cycle (with for cycle cases)
QT interface optimization: QT border removal and form rounding
C语言p2选择分支语句详解
KVM learning resources
redis的五种数据类型
电子秤称重系统设计,HX711压力传感器,51单片机(Proteus仿真、C程序、原理图、论文等全套资料)
外包干了四年,废了...
Nacos作为配置中心(四) 使用Demo
[servlet] detailed explanation of servlet (use + principle)
API Gateway/API 网关(二) - Kong的使用 - 负载均衡Loadbalance
8.5 循环神经网络简洁实现
IE8 browser prompts whether to block access to JS script
On the insecurity of using scanf in VS
51单片机+LCD12864液晶显示的俄罗斯方块游戏,Proteus仿真、AD原理图、代码、论文等
Detailed explanation of C language knowledge points -- first knowledge of C language [1]
kprobe 的 3 种使用