javac 编译器将 Java 代码编译成 class 文件 (前期编译),再给 JVM 根据不同平台 , 通过执行引擎转为机器码
JVM 用 : 混合模式 (解释+编译) :
- 对不常用代码,不浪费时间编译成机器码,用时以解释运行
- 对热点代码,用编译方式,追求更高效率
解释执行
Interpreter : 将字节码逐条换成机器码
- 刚开始只用解释执行,当某些方法或代码块 , 执行较频繁,就转为热点代码
即时编译器
Just-In-Time compilation(JIT) : 将字节码编译成可执行文件,运行速度快
- 即时编译器将热点代码编译成机器码,并优化,存到内存中
HotSpot 内置两个JIT :
- C1 : Client Compiler : 适用执行时间短或 对启动性能有要求的程序
- C2 : Server Compiler : 适用执行时间长或 对峰值性能有要求的程序
Java7 后,HotSpot 用分层编译的方式
- 热点方法先被 C1 编译,再热点中的热点 , 被 C2 再编译
AOT
Java9 后 ,引入AOT(Ahead-Of-Time) 编译器文章来源:https://www.toymoban.com/news/detail-511222.html
- 程序运行前,将字节码转为机器码
- 优势 :不用运行时 , 消耗资源来进行即时编译
- 劣势 : 无法感知程序运行时信息,无法基于类层次分析的完全虚方法内联,或基于程序 profile 的投机性优化
Graal VM
Java10 后,引入 Graal 编译器文章来源地址https://www.toymoban.com/news/detail-511222.html
- 比 C1, C2,模块化明显,更易维护
- Graal 既能动态编译器,有能静态编译器
- 能编译不同的编程语言 , 成为二进制码,实现不同语言的无缝切换
到了这里,关于JVM 执行引擎的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!