Java 的 AOT(Ahead-Of-Time)

1. 定义

AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式。

在 AOT 模式下,Java 字节码(Bytecode)在程序运行之前,就被提前编译为目标平台的本地机器代码。

  • AOT 编译器:一个工具链,用于在构建阶段生成本地代码,而不是在运行时进行即时编译。
  • 目标:通过提前编译减少运行时的开销,加快启动速度。

2. AOT 的工作原理

AOT 编译的过程通常包括以下步骤:

  1. Java 源代码编译

    • 使用传统的 Java 编译器(如 javac)将 .java 源文件编译为 .class 文件(字节码)。
  2. AOT 编译

    • 使用 AOT 编译器(如 GraalVM 的 native-image)将字节码编译为本地二进制可执行文件。
  3. 执行

    • 最终生成的二进制文件可以直接在目标平台上运行,无需依赖 JVM。

3. 与 JIT 的对比

特性 AOT 编译 JIT 编译
编译时机 在程序运行之前完成 在程序运行时即时完成
启动性能 快速启动,减少初始延迟 启动慢,依赖解释器或编译器
运行时优化 无法动态优化 可以根据运行时信息优化代码
目标代码通用性 针对特定平台生成 字节码具有跨平台能力
二进制文件体积 通常较大 仅存储字节码,体积较小

4. AOT 的优缺点

优点:

  1. 启动速度快

    • 编译后的二进制文件是直接可执行的,无需启动 JVM。
  2. 更低的内存占用
    • 无需 JVM 运行时的额外内存开销。
  3. 可预期的性能
    • 编译时的优化让性能稳定,不受运行时环境的变化影响。

缺点:

  1. 缺乏动态优化

    • 无法像 JIT 那样根据运行时的实际情况进行优化。
  2. 跨平台受限
    • 生成的本地代码仅能在特定的平台上运行,丧失了 Java 的“跨平台”特性。
  3. 构建时间长
    • AOT 编译通常比字节码编译更耗时。

5. AOT 的实现

5.1 GraalVM 的 native-image

GraalVM 是支持 AOT 编译的 Java 运行时环境,提供了 native-image 工具,可将 Java 应用程序编译为本地可执行文件。

示例:使用 GraalVM 编译应用

  1. 编写一个简单的 Java 程序:

    public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("Hello, AOT!");
    }
    }
  2. 使用 native-image 进行 AOT 编译:

    native-image -cp . HelloWorld
  3. 运行生成的二进制文件:

    ./helloworld

输出:

Hello, AOT!

5.2 其他 AOT 工具

  • IBM J9 AOT: 提供 AOT 支持,优化 Java 应用的启动性能。
  • Excelsior JET: 第三方工具,已停更,但曾支持 AOT 编译。

6. AOT 的应用场景

  1. 云原生应用:

    • 快速启动的特性非常适合容器化部署的微服务。
  2. 嵌入式系统:
    • 减少对运行时环境(如 JVM)的依赖,降低资源占用。
  3. 低延迟场景:
    • 启动延迟较低的应用,如命令行工具或批处理程序。

7. 总结

  • AOT(Ahead-Of-Time)编译 是在程序运行前将字节码转化为本地机器代码的技术,能够显著提升启动性能。
  • 优点:启动快、内存占用低、性能稳定。
  • 缺点:缺乏运行时优化能力,构建时间较长。
  • AOT 编译工具(如 GraalVM 的 native-image)为现代 Java 开发提供了强大的支持,在云原生应用、嵌入式设备等场景中有重要应用。

什么是 Java 的 AOT(Ahead-Of-Time)?的更多相关文章

  1. java JIT AOT

    作者:ETIN链接:https://zhuanlan.zhihu.com/p/27393316来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. I guess anyon ...

  2. 请一定记得升级java虚拟机

    对于吃货出身又需要保持体重的我,出门一定要带男票,因为这样就可以把见到的好吃的都买给他吃,就当是自己吃了[汗].偶尔做梦还是会梦到自己一个角落里偷吃东西,听到有脚步声,抬起头,大哭起来:“我饿了.”  ...

  3. java核心36

    1 Java平台 Java采用的是解释和编译混合的模式.它首先通过javac将源码编译成字节码文件class.然后在运行的时候通过解释器或者JIT将字节码转换成最终的机器码.只是用解释器的缺点:抛弃了 ...

  4. [转] Java 基础

    1. 面向对象和面向过程的区别 面向过程 面向对象 2. Java 语言有哪些特点 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 JVM JDK 和 JRE 4. Oracle JDK 和 ...

  5. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    1.什么是JVM?   JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...

  6. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对照

    1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编 ...

  7. 【转】关于Java基础你不得不会的34个问题

    1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的 ...

  8. 面试又被 Java 基础难住了?推荐你看看这篇文章。

    本文已经收录自 JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. 1. 面向对象和面向过程的区别 面向过程 :面向过程性能比面 ...

  9. 学习记录-java基础部分(一)

    学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...

  10. 应届生/社招面试最爱问的几道Java基础问题

    本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...

随机推荐

  1. 关于CSRF漏洞的一次有趣的交互

    前言 在一次项目中,挖掘了一些CSRF漏洞,将细节提交给客户后,发生了一些有趣的交互,这里简单的先把他叫为薛定谔的CSRF,对其深入了解了一下,且听我细细道来. 薛定谔的CSRF 故事背景是对一个项目 ...

  2. Linux重要的日志文件

    1./var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息 2./var/log/syslog 只记录警告信息,常常是系统出问题的信息,所 ...

  3. SpringBoot利用@Async注解实现异步调用

    前言:异步编程是让程序并发运行的一种手段,使用异步编程可以大大提高我们程序的吞吐量,减少用户的等待时间.在Java并发编程中实现异步功能,一般是需要使用线程或者线程池.而实现一个线程,要么继承Thre ...

  4. Linux系统下nginx的安装与卸载

    1.1 安装 准备依赖环境 1.安装 gcc 依赖库 yum install gcc-c++ 2.安装 PCRE pcre-devel 依赖库 yum install -y pcre pcre-dev ...

  5. UE5 C++ 程序进程退出

    // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include ...

  6. 记录一段mysql代码

    SELECT f . * , tmp.userid, tmp.cishu FROM fx_user f, ( SELECT a.id, b.userid AS userid, COUNT( * ) A ...

  7. Windows 提权-MSSQL

    本文通过 Google 翻译 MSSQL – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 ...

  8. 2022美亚杯个人赛wp(纯文字思路)

    2022美亚杯个人赛wp(纯文字思路) vc镜像密码CZDGm#&2_Ns$7wSMn%ZGr7xntcHS7d5uFta#Up9544jx_cvP$uFM7?pTDa*jN&QyFD ...

  9. ABAQUS弹塑性分析

    1. 弹塑性分析的主要问题 1.1 elastic-plastic deform behavior abaqus 默认的塑性表现行为是金属材料经典塑性理论,采用mises屈服面定义各向同性屈服. 一般 ...

  10. 【MathType】word2016数学公式编号

    问题 毕业论文排版中,对数学公式需要类似(3-1)的格式. 解决技巧 在写论文初稿的时候,先不要于公式的编号,先给它编一个号,比如(3) (2) (4)的. 最后写完了以后,再再添加section , ...