为了支持云原生和容器化环境,JVM 在执行 Java 程序时也在逐步从 JIT 编译转向 AOT 编译。这种转变可以通过 GraalVM 等工具来实现。
在传统的 JIT 编译中,Java 程序在运行时会将字节码逐行编译成机器代码。这种动态编译能够针对运行时的状态和调用频率进行优化,但也导致了性能延迟和启动速度较慢的问题。
为了解决这些问题并适应云原生环境,JVM 引入了 AOT 编译。AOT 编译是在程序运行之前将字节码直接编译成本地机器代码。这种方式可以提高程序的运行速度和启动速度,并减少运行时动态编译的开销。
为了从 JIT 过渡到 AOT,JVM 将字节码与 AOT 编译相结合。在 JIT 编译运行时,JVM 会监视代码的执行情况并收集相关的运行时信息,然后将这些信息传递给 AOT 编译器。AOT 编译器会利用这些信息对字节码进行优化,并生成可执行的本地机器代码。这样,当相同的代码再次执行时,就可以直接使用 AOT 编译得到的机器代码,而无需再次启动 JIT 编译。
这种 JIT 和 AOT 结合的方式可以在保持性能优化和动态适应性的同时,拥有更快的启动时间和更高的执行速度。这样 Java 程序就能更好地适应云原生和容器化的环境了,性能和可扩展性也更好。
Ahead-of-Time(AOT)编译并没有完全替代Just-in-Time(JIT)编译,而是和JIT编译结合在一起来使用。AOT编译和JIT编译各有优缺点。例如,AOT编译的优点在于它可以在应用程序运行前进行,从而减少了应用程序启动时的延迟。另一方面,它的缺点是,由于它不能利用到运行时的信息,例如运行时的类型信息和热点代码信息等,因此它往往无法达到JIT编译那样的优化程度。因此,目前的JVM实现往往结合使用AOT编译和JIT编译,以便同时利用二者的优点。一般的做法是,在应用程序启动时,先使用AOT编译生成的代码,然后在运行过程中,通过JIT编译对热点代码进行更深度的优化。这种做法既可以减少应用程序的启动延迟,又可以保证应用程序运行时的高效性能。
此文章为9月Day9学习笔记,内容来源于极客时间《云时代 》,强烈推荐该课程












网友评论