文章目录
执行引擎概述
执行引擎的工作过程
- 执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器
- 每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址
- 方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息
- 从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:
- 输入的是字节码二进制流,处理过程是字节码解析执行的等效过程
- 输出的是执行结果
Java代码编译和执行过程
大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经过下图的各个步骤
Java代码编译
Java代码编译是由Java源码编译器来完成的,流程如下所示:
Java代码执行
Java字节码的执行是由JVM执行引擎来完成的,流程如下所示:
什么是解释器,什么是JIT编译器?
-
解释器
当Java虚拟机启动时会根据预定义的规范堆字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行
-
JIT(Just In Time Compiler)编译器
编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言
为什么说Java是半编译半解释型语言?
机器码、指令、汇编语言
机器码
指令、指令集
汇编语言
高级语言
C、C++源程序执行过程
编译过程又可以分成两个阶段:编译和汇编
- 编译过程:是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码
- 汇编过程:实际上指把汇编语言代码翻译成目标机器指令的过程
字节码
解释器
JVM设计者们的初衷仅仅只是单纯地为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法
解释器工作机制(或工作任务)
解释器分类
现状
JIT编译器
Java代码的执行分类
解释器与编译器的抉择?
HotSpot JVM的执行方式
经典案例
JIT编译器概念解释
热点代码及探测方式
方法调用计数器
热度衰减
回边计数器
HotSpot VM中JIT分类
总结
- 一般来说,JIT编译出来的机器码性能比解释器高
- C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器
扩展内容
关于AOT编译器