目录
- 1. 说明
- 2. AOT编译器的引入与基本概念
- 3. AOT编译器的工作原理与流程
- 4. 优点
- 5. 缺点
- 6. AOT编译器与JIT编译器的比较
- 6.1 JIT编译器
- 6.2 AOT编译器
- 7.AOT编译器的应用场景与限制
1. 说明
- 1.JVM(Java虚拟机)中的AOT(Ahead Of Time)编译器是一种静态提前编译器,它在程序运行之前将Java字节码转换为机器码。
2. AOT编译器的引入与基本概念
- 1.引入:JDK9引入了AOT编译器及AOT编译工具jaotc。
- 2.基本概念:AOT编译指的是在程序运行之前,便将字节码转换为机器码的过程。这与即时编译(JIT)相对立,JIT是在程序的运行过程中进行编译。
3. AOT编译器的工作原理与流程
- 1.工作原理:AOT编译器借助Graal编译器(或其他底层编译器技术),将输入的Java类文件转换为机器码,并存放至生成的动态共享库之中。
- 2.流程:Java源代码首先通过javac编译器编译成字节码(.class文件),然后使用jaotc工具将字节码转换为机器码(如.so文件)。
4. 优点
- 1.JVM加载已经预编译成二进制库,可以直接执行,无需通过解释器执行,减少了Java应用“第一次运行慢”的不良体验。
- 2.把编译的本地机器码保存到磁盘,不占用内存,并可多次使用。
5. 缺点
- 1.破坏了Java“一次编译,到处运行”的特性。必须为每个不同的硬件和操作系统编译对应的发行包。
- 2.降低了Java链接过程的动态性。加载的代码在编译工作前就必须全部已知。
6. AOT编译器与JIT编译器的比较
6.1 JIT编译器
- 1.优点:可以根据当前硬件情况实时编译生成最优机器指令;可以根据当前程序的运行情况生成最优的机器指令序列;当程序需要支持动态链接时,只能使用JIT。
- 2.缺点:编译需要占用运行时资源,会导致进程卡顿;对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡。
6.2 AOT编译器
- 1.优点:在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗;可以在程序运行初期就达到最高性能;显著的加快程序的启动。
- 2.缺点:在程序运行前编译会使程序安装的时间增加;牺牲Java的一致性;将提前编译的内容保存会占用更多的外部存储空间。
7.AOT编译器的应用场景与限制
-
1.应用场景:AOT编译器适用于对启动速度有较高要求,且不需要频繁更新代码的应用场景。
-
2.限制:由于AOT编译器需要为每个不同的硬件和操作系统编译对应的发行包,因此其灵活性和可移植性受到一定限制。