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. vue3.5保证你看得明明白白

    子组件中设置默认属性 <template> <div class="child-page"> <h1>我是子组件</h1> < ...

  2. EasyExcel 通过模板填充数据

    EasyExcel 通过模板填充数据两种方式:1.直接通过模板填充.2.通过IO流填充. 模板示例 注意:单个字段填充只写字段名即可,数据集填充需要在字段前加 . {title} 姓名 昵称 手机号 ...

  3. 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!

    1 大人,时代变了! 赶快把自有业务的本地AI"模型"训练起来! 1.1 背景   目前AI已经大行其道,chatGPT.DeepSeek等如雨后春笋般涌现出来,笔者做为一个守旧派 ...

  4. Google 助手安装

    转自:https://www.jianshu.com/p/6086ec29c173 今天这篇推送可能是很多人都需要的,因为它能帮助你无阻碍的访问Google.Google scholar.Gmail. ...

  5. 越“挖”越有料,天翼云“息壤”助攻DeepSeek变身万能搭子!

    还在为DeepSeek服务器繁忙而抓狂? 还在为API调用费用涨价而头疼? 还在为数据安全而担忧? 别急! 天翼云"息壤"算力互联调度平台出马 全面解锁DeepSeek新玩法 带你 ...

  6. 论今日,Vue VSCode Snippets 不进行代码提示的问题 或 vetur Request textDocument/documentSymbol failed.

    这他喵的是因为 vetur 这个鬼东西升级了,然后和项目中某些包不匹配了, 降级就好了, 法克尤啊法克尤,我整了一天,大概是坏了吧 灵感来源:https://cxymm.net/article/a84 ...

  7. 利用JS 代码块 为你的 Typecho博客添加一个 Copy 按钮

    引入 JS 将以下代码添加到主题 header.php 中的 </head> 标签前,本主题也可以前往 控制台 - 设置外观 - 主题自定义扩展,将它添加到 自定义 HTML 元素拓展 - ...

  8. [SWPUCTF 2021 新生赛]ez_unserialize

    概括 这是一道PHP反序列化的CTF赛题,本意是想用这道题对PHP反序列化进行一定的学习. 过程 我们打开赛题,看看内容 没有发现什么东西,看看他的页面代码 根据他的提示,感觉是存在一个robots. ...

  9. css 保留后端 textarea 中的换行与空格字符

    原文链接:https://blog.jijian.link/2020-10-22/css-pre/ 如果后台使用 textarea 输入内容,在前段显示需要保留换行符与空白字符,该如何做? 常规方法 ...

  10. hexo 图片添加水印(png, jpeg, jpg, gif)

    文章同步发布:https://blog.jijian.link/2020-04-21/hexo-watermark/ 本文折腾 hexo 图片添加水印功能,大部分代码沿用: nodejs 图片添加水印 ...