![](https://img.kancloud.cn/3c/ad/3cada3a2f891b2b16597ec0039cc8c33_2762x1342.png) ### JIT(Just-In-Time)和AOT(Ahead-Of-Time)是两种不同的代码编译和执行方式,各有优缺点。 ### JIT(Just-In-Time)编译 JIT编译是在程序运行时即时进行代码编译。Java虚拟机(JVM)在执行Java字节码时,会将部分热点代码(即多次执行的代码)编译为机器码,从而提升运行时的性能。 **优点:** 1. **动态优化**:JIT可以根据运行时的实际情况进行动态优化,提升代码执行效率。例如,JIT可以进行内联、逃逸分析等优化。 2. **更少的初始启动时间**:因为JIT编译是逐步进行的,应用程序的启动速度通常较快。 3. **跨平台性**:Java字节码在任何支持JVM的环境中都能运行,JIT只需在运行时进行平台相关的优化和编译。 **缺点:** 1. **运行时开销**:JIT编译需要在运行时消耗一定的资源进行编译,可能会导致初期性能下降。 2. **不稳定的性能**:因为编译是在运行时进行的,可能会在某些情况下出现性能不稳定的情况。 ### AOT(Ahead-Of-Time)编译 AOT编译是在程序运行之前,提前将代码编译为机器码。Spring Boot 3 引入了对AOT的支持,特别是针对GraalVM Native Image,能够在编译期将Java应用程序编译为原生可执行文件。 **优点:** 1. **快速启动**:因为AOT已经在编译期完成了所有的编译工作,应用程序的启动速度非常快。 2. **更低的内存占用**:AOT编译的应用程序不需要JVM,因此可以显著减少内存占用。 3. **确定的性能**:因为所有的编译工作都在运行之前完成,运行时不会再有编译开销,性能更加稳定和可预测。 **缺点:** 1. **编译时间较长**:AOT编译需要在编译阶段进行大量的优化和分析,因此编译时间较长。 2. **兼容性问题**:AOT编译可能会遇到某些Java特性的兼容性问题,特别是依赖动态特性和反射的代码。 3. **缺乏动态优化**:因为编译是在运行之前完成的,AOT不能根据运行时的实际情况进行动态优化,可能在某些情况下性能不如JIT优化后的代码。 ### 总结 JIT和AOT各有优缺点,选择使用哪种编译方式主要取决于应用场景和需求。JIT适合需要跨平台且需要动态优化的应用,而AOT则适合需要快速启动、低内存占用和稳定性能的应用。Spring Boot 3 通过支持GraalVM Native Image引入了AOT编译,为开发者提供了更多选择,特别是在构建高性能和资源受限的微服务时,AOT是一个很好的选项。 ### ![](https://img.kancloud.cn/d0/2b/d02b44caac37d9cea0e95be16fdbd758_2620x1304.png) ### ![](https://img.kancloud.cn/9c/af/9caf7eb9f8292ceff56d53a71af2881b_2620x1504.png) ### ![](https://img.kancloud.cn/44/45/44454f50ba2bde2ac791cc55258a68dd_2226x1392.png) ### **在服务启动之后不久,大量请求进来的时候传统的JIT通常会有这样的问题:** ![](https://img.kancloud.cn/64/09/64093b451c9a4950c5bc0c8acd155c88_2952x1434.png) ### ![](https://img.kancloud.cn/09/e5/09e563f2749ec0394017c7d08bef3e54_2070x1436.png) ### 如果一个类被大量的请求加载那么就不会再走传统的解释器这条道路 而是直接被JIT编译 因为大量的类被JIT进行编译那么这个时候就会CPU爆满内存爆满导致服务重启 不是每个类进来就会被进行JIT编译 比如一个类被加载了一万次那么就有可能被JIT编译 ### 阿里巴巴也曾经遇到过这样的问题 ![](https://img.kancloud.cn/24/f4/24f4baf1ced13b20f597c1ed52ed251c_1956x742.png) ### 如何解决呢? ![](https://img.kancloud.cn/ef/cd/efcdeb0cc13c30bb336ce55594afa6e3_2728x1210.png) ### 在springboot3当中引入了AOT 是通过GraalVM代替JDK来实现的AOT ![](https://img.kancloud.cn/4d/7c/4d7cdd27c1e8353cb8de202a2aa8e4da_2972x1008.png) ### GraalVM也是一个虚拟机 也是需要安装的 当然只需要在你的开发环境安装就行了 在开发环境你可以将程序编译为Linux当中可以运行的二进制文件 这样就不需要像传统方式去安装JVM虚拟机了 ###