执行引擎的作用
由软件自行实现的,不受物理机的制约指令集,能够执行不背硬件执行的指令。

将字节码指令解析/编译为对应平台上本地机器指令才可以

jvm的执行引擎输入输出是一致的:输入二进制字节码,输出的执行结果。

JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。

java代码的编译执行过程:

JVM:执行引擎_编译器


解释器

当java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应平台的本地机器指令执行。解释器的执行速度比JIT编译器速度慢。但是解释器的响应速度很快。当程序启动后解释器可以首先发挥作用,而不必等即时编译器全部编译完成再执行,可以省去很多不必要的编译时间。随着时间的推移,即时编译器发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。

JIT编译器
JIT(Just In Time Compiler)编译器就是Java虚拟机将源代码直接编译成和本地机器平台相关的机器语言。JIT编译器将热点代码翻译成机器指令缓存在方法区中。这样之后执行的时候效率将大大提高
JIT又分为C1(Client) C2(Server)
JDK10起又有了Graal编译器

前端编译器:.java->.class
后端编译器(JIT编译器) 字节码指令->机器码
静态提前编译器(AOT 编译器 Ahead OF TIme Compiler)直接把.java文件变成成本地机器码

统计方法的调用次数(阈值 Client模式:1500 Server模式:10000)默认server模式

JVM:执行引擎_字节码_02


方法被调用会判断是否已编译,如果是就执行编译后的代码,否则就方法调用计算器+1,然后判断是否超过阈值,没有就解释器执行,超过了就jit编译器后台执行。

热度衰减:方法的调用并不是无限计算,是在一定时间内的计数,当一定时间没超过阈值就减半,这个过程称为计数器热度的衰减。这段时间被称为半衰周期(热度衰减动作是在垃圾收集时顺便执行的)

回边计数器:

统计用于循环体执行的循环次数

回边计数器没有热度衰减的过程

JVM:执行引擎_字节码_03


c1和c2编译器

client默认c1,编译更快

server默认c2,执行效率更高(c++编写的)

分层编译:程序解释执行可以触发c1编译,将字节码编译为机器码,可以进行简单优化,也可以加上性能监控,c2编译会根据西能监控信息进行激进优化。

jdk7之后会默认开启分层编译,c1和c2协作执行编译任务。