提前编译:AOT

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值