什么是 Java 的 AOT(Ahead-Of-Time)?

Sherwin.Wei Lv8

什么是 Java 的 AOT(Ahead-Of-Time)?

回答重点

Java 的 AOT(Ahead-Of-Time,预编译)是一种在程序运行之前,将 Java 字节码直接编译为本地机器码的技术。

JIT 是在 Java 运行时将一些代码编译成机器码,而 AOT 则是在代码运行之前就编译成机器吗,也就是提前编译。

提前编译的好处是减少运行时编译的开销,且减少程序启动所需的编译时间,提高启动速度。

扩展知识

AOT 的工作原理:

AOT 编译是在构建阶段对 Java 字节码进行静态分析,并将其编译为目标平台的机器码。编译后的代码可以直接运行在目标硬件上,无需在运行时通过 JVM 进行解释或即时编译。

AOT 的优点:

  • 快速启动:由于代码已经编译为本地机器码,AOT 减少了程序启动时的编译开销,适合需要快速启动的应用场景。
  • 更小的内存占用:在不需要 JIT 编译器的情况下,AOT 编译减少了 JVM 的内存占用。

AOT 的缺点:

缺乏运行时优化:AOT 编译器无法像 JIT 编译器那样利用运行时的动态信息进行深度优化,可能导致在长时间运行的应用程序中性能低于 JIT。

平台依赖性:AOT 编译出的机器码是针对特定平台的,缺乏跨平台的灵活性。

使用场景:

AOT 主要用于要求快速启动的应用程序,如微服务、容器化应用、嵌入式系统,以及对启动性能比较敏感的场景。

Java 的 AOT 工具:

  • GraalVM:GraalVM 是一个多语言虚拟机,支持 Java 的 AOT 编译。它可以将 Java 应用程序编译成独立的本地可执行文件,这些文件不依赖于 JVM,即可直接在目标操作系统上运行。

  • jaotc:在 Java 9 中引入的 jaotc 工具可以将 Java 字节码编译为 AOT 的本地代码。不过,jaotc 的使用在生产环境中并不广泛。

Comments