JIT与AOT的区别
IT和AOT这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译
(1)JIT,Just-in-time,动态(即时)编译,边运行边编译
在程序运行时,根据算法计算出热点代码,然后进行JIT实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发JIT 的分层机制。JIT 缺点就是编译需要占用运行时资源,会导致进程卡顿。
(2)AOT,Ahead ofTime,指运行前编译,预先编译
AOT编译能直接将源代码转化为机器码,内存占用低,启动速度快,可以无需runtime 运行,直接将runtime静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化,AOT 缺点就是在程序运行前编译会使程序安装的时间增加。
简单来讲:
JIT即时编译指的是在程序的运行过程中,将字节码转换为可在硬件上直接运行的机器码,并部署至托管环境中的过程。
而AOT 编译指的则是,在程序运行之前,便将字节码转换为机器码的过程。
.java -> .class -> (使用jaotc编译工具) -> .so(程序函数库,即编译好的可以供其他程序使用的代码和数据)
(3)AOT的优点
简单来讲,Java 虚拟机加载已经预编译成二进制库,可以直接执行。不必等待及时编译器的预热,减少Java 应用给人带来“第一次运行慢”的不良体验
在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
可以在程序运行初期就达到最高性能,程序启动速度快
运行产物只有机器码,打包体积小
(4)AOT的缺点
由于是静态提前编译,不能根据硬件情况或程序运行情况择优选择机器指令序列,理论峰值性能不如JIT没有动态能力,同一份产物不能跨平台运行
第一种即时编译(JIT)是默认模式,Java Hotspot 虚拟机使用它在运行时将字节码转换为机器码。后者提前编译(AOT)由新颖的GraalVM 编译器支持,并允许在构建时将字节码直接静态编译为机器码。
现在正处于云原生,降本增效的时代,java 相比于Go、Rust 等其他编程语言非常大的弊端就是启动编译和启动进程非常慢,这对于根据实时计算资源,弹性扩缩容的云原生技术相冲突,Spring6 借助AOT 技术在运行时内存占用低,启动速度快,逐渐的来满足Java 在云原生时代的需求,对于大规模使用Java 应用的商业公司可以考虑尽早调研使用JDK17,通过云原生技术为公司实现降本增效。
Graalvm
Spring6支持的AOT技术,这个GraalVM 就是底层的支持,Spring也对GraalVM 本机映像提供了一流的支持GraalVM 是一种高性能JDK,旨在加速用Java 和其他VM语言编写的应用程序的执行,同时还为JavaScript、Pvthon 和许多其他流行语言提供运行时。
GraalVM 提供两种运行Java 应用程序的方法:在HotSpotJVM 上使用Graal即时(JIT)编译器或作为提前(AOT)编译的本机可执行文件。GraalVM 的多语言能力使得在单个应用程序中混合多种编程语言成为可能,同时消除了外语调用成本。GraalVM 向 HotSpotJava 虚拟机添加了一个用Java编写的高级即时(JIT)优化编译器。
GraalVM 具有以下特性:
(1)一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源
(2)AOT本机图像编译提前将Java 应用程序编译为本机二进制文件,立即启动,无需预热即可实现最高性能
(3)Polyglot 编程在单个应用程序中利用流行语言的最佳功能和库,无需额外开销
(4)高级工具在Java和多种语言中调试、监视、分析和优化资源消耗
总的来说对云原生的要求不算高短期内可以继续使用2.7.X 的版本和JDK8,不过Spring 官方已经对Spring6进行了正式版发布。
Native lmage
目前业界除了这种在IVM中进行AOT的方案,还有另外一种实现ava AOT的思路,那就是直接摒弃JVM,和C/C++一样通过编译器直接将代码编译成机器代码,然后运行。这无疑是一种直接颠覆Java语言设计的思路,那就是GraalVM Native lmage。
它通过语言实现了一个超微缩的运行时组件--Substrate VM,基本实现了JVM的各种特性,但足够轻量、可以被轻松内嵌,这就让lava语言和工程摆脱IVM的限制,能够真正意义上实现和C/C++一样的AOT编译。
这一方案在经过长时间的优化和积累后,已经拥有非常不错的效果,基本上成为Oracle官方首推的JavaAOT解决方案。
Native lmage 是一项创新技术,可将Java 代码编译成独立的本机可执行文件或本机共享库。在构建本机可执行文件期间处理的Java 字节码包括所有应用程序类、依赖项、第三方依赖库和任何所需的JDK 类。生成的自包含本机可执行文件特定于不需要JVM 的每个单独的操作系统和机器体系结构。
演示Native lmage构建过程
1.GraaIVM安装
下载GraaIVM
https://www.graalvm.org/downloads/
配置系统变量:
修改JAVA_HOME
修改Path目录:
使用命令查看是否安装成功
java -version
安装native-image插件
在cmd窗口,使用命令gu install native-image下载安装
使用命令gu list查看当前插件
2.安装c++编译环境
安装visual studio
https://visualstudio.microsoft.com/zh-hans/
添加visual studio环境变量
配置INCLUDE、LIB和Path