JVM——执行引擎
JVM——执行引擎

本地方法接口(JNI)
本地方法:非Java语言编写的方法
为什么要使用本地方法?
- Java需要与外面的环境进行交互
- 有些层次的任务用Java实现起来不容易,或者对效率很在意
- 与操作系统交互,操作系统用c语言实现
- Sun’s Java,Sun的解释器使用c语言实现的
本地方法库:C语言编写的
为什么Java是半解释半编译型语言?
JVM可以自由选择是通过解释器或者JIT编译器去执行程序。现在JVM在执行Java代码通常会将解释执行与编译执行结合起来进行。
什么是解释器(Interpreter),什么是JIT编译器?
解释器:对字节码采用逐行解释的方式执行
JIT(Just In Time Compiler)编译器:虚拟机将源代码直接编译成和本地机器平台相关的机器语言,将机器指令缓存起来一次性执行。
JIT编译器效率高,为什么还需要解释器呢?
他们各有所长,解释器响应速度快,编译器执行效率高。
当虚拟机启动时,解释器首先发挥作用,而不必等待及时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,及时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。
同时,解释执行在编译器进行激进优化不成立的时候,作为编译器的“逃生门”。
Hotspot VM设置执行方式
- -Xint:完全采用解释器执行
- -Xcomp:完全采用JIT编译器执行
- -Xmixed:采用混合模式
如何选择采用解释器还是JIT编译器?
- JIT编译器
- 执行频率高的热点代码
- 基于计数器的热点探测
- 方法调用计数器,用于统计方法调用次数,默认阈值:client模式下是1500次,server模式下是10000次,可以通过-XX:CompileThreshold设置
- 回边计数器,用于统计循环体执行的循环次数
- 热度衰减
JIT编译器分为Client Compiler和Server Compiler和Graal
- -client:C1编译器会对字节码进行简单可靠的优化,耗时短。
- -server:C2对字节码优化的更深,耗时长,以及激进化。主要基于逃逸分析(标量替换,栈上分配,同步消除)的基础进行优化。
- 自JDK10起,HotSpot加入了Graal模式。
JDK9引入了AOT编译器(静态编译器,Ahead Of Time Compiler),与JIT是同类
- 优点:AOT编译器是在Java代码编译class字节码之后,通过jaotc工具将class文件进行提前编译,大大降低了程序启动时候的时间(.java—>.class—>.so)
- 缺点:破坏了Java“一次编译,到处运行”;降低了Java链接过程的动态性
JVM——执行引擎
http://example.com/2023/03/09/Java/JVM/JVM执行引擎/