尚硅谷2020最新版宋红康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文件变成成本地机器码

热点代码

什么时候用解释器,什么时候用JIT编译器需要根据代码被执行的频率而定。被JIT编译成机器码的代码叫做热点代码。JIT在运行时会针对那些频繁被调用的热点代码做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能。
一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为热点代码。因此都可以通过JIT编译器编译为本地机器指令。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换。

探测方式

目前HotSport虚拟机所采用的热点参测方式是基于计数器的热点探测。HotSport为每一个方法都建立2个不同类型的计数器

方法调用计数器:

统计方法的调用次数(阈值 Client模式:1500 Server模式:10000)
在这里插入图片描述
热度衰减:方法调用计数器统计的并不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间之内方法被调用的次数。当超过一定的时间限度,如果还没达到阈值那么计数器就减半,这个过程称为计数器热度的衰减。这段时间被称为半衰周期(热度衰减动作是在垃圾收集时顺便执行的)

回边计数器

统计用于循环体执行的循环次数
回边计数器没有热度衰减的过程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30033509/article/details/110918767