知识卡片
AOT原生镜像用构建期开销换运行期性能
内容
标准 Java 应用靠 JIT(即时编译)运行:编译器先把源码编成字节码,运行时再由 JVM 边解释边优化成机器码,这换来了”一次编译到处运行”的可移植性,代价是启动阶段要经历解释、优化这些运行时开销,动辄几秒钟。GraalVM 的 Native Image 模式反过来做 AOT(预先编译):从 main 方法出发,静态分析所有可达的类和方法,把整个应用连同依赖库直接编译成一份不依赖 JVM、能在机器上直接跑的二进制可执行文件,像 C/C++ 程序一样启动,启动时间能压到 100 毫秒以内,内存占用也显著降低。但代价对等地转移到了构建阶段:编译过程本身要花更久、吃更多计算资源,而且反射、动态代理、序列化、动态类加载这些依赖运行时信息的 Java 特性,AOT 编译器没法只靠静态分析搞清楚该怎么处理,需要额外配置才能支持。发散:这是”什么时候付出成本”的一次重新分配——JIT 把优化开销摊到每次运行时,AOT 把开销一次性收在构建时,本质上是在”运行时性能”和”构建灵活性/动态特性支持”之间做取舍,不存在免费的启动加速。
参考来源
《Cloud Native Spring in Action》第16章《Serverless, GraalVM, and Knative》