JIT和AOT介绍

JIT和AOT介绍

介绍了JIT和aot的基本概念

 次点击
18 分钟阅读

2026-3-7

JIT

java语言由javac编译成通用的中间形式——字节码,以.class结尾,字节码文件由jvm虚拟机将字节码解释为机器码运行,从而实现了java语言的‘一次编译,随处运行’,Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。不过在性能上,Java通常不如C++这类编译型语言。

.class 文件到机器码阶段有一个性能瓶颈,在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。有些方法和代码块经常需要被调用(热点代码),所以引进了 JIT(Just in Time Compilation) 编译器,当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。

当程序运行时,解释器首先发挥作用,代码可以直接执行。随着时间推移,即时编译器逐渐发挥作用,把越来越多的代码编译优化成本地代码,来获取更高的执行效率。解释器这时可以作为编译运行的降级手段,在一些不可靠的编译优化出现问题时,再切换回解释执行,保证程序可以正常运行。

美团技术团队

由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。可以说java语言是“编译与解释并存”的语言。

AOT

JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation) 。和 JIT 不同的是,这种编译模式会在程序被执行前就将其编译成机器码,属于静态编译。

AOT 避免了 JIT 预热等各方面的开销,可以提高 Java 程序的启动速度,避免预热时间长,还能减少内存占用和增强 Java 程序的安全性(AOT 编译后的代码不容易被反编译和修改)。但是AOT 编译无法支持 Java 的一些动态特性,如反射、动态代理、动态加载、JNI(Java Native Interface)等。

JIT 与 AOT 两者的关键指标对比

对比维度

JIT(即时编译)

AOT(提前编译)

编译时机

运行时编译

运行前编译

启动速度

较慢(需要预热)

快(无需预热)

峰值性能

更高(运行时优化)

较低(缺少运行时信息)

内存占用

较高

较低

打包体积

较小

较大(包含机器码)

动态特性支持

完全支持

受限(反射、动态代理等)

适用场景

长时间运行的服务

云原生、Serverless、CLI 工具

本文参考链接:javaguide

© 本文著作权归作者所有,未经许可不得转载使用。