什么是 Java 的 AOT(Ahead-Of-Time)?
Java 的 AOT(Ahead-Of-Time)
1. 定义
AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式。
在 AOT 模式下,Java 字节码(Bytecode)在程序运行之前,就被提前编译为目标平台的本地机器代码。
- AOT 编译器:一个工具链,用于在构建阶段生成本地代码,而不是在运行时进行即时编译。
- 目标:通过提前编译减少运行时的开销,加快启动速度。
2. AOT 的工作原理
AOT 编译的过程通常包括以下步骤:
Java 源代码编译:
- 使用传统的 Java 编译器(如
javac)将.java源文件编译为.class文件(字节码)。
- 使用传统的 Java 编译器(如
AOT 编译:
- 使用 AOT 编译器(如 GraalVM 的
native-image)将字节码编译为本地二进制可执行文件。
- 使用 AOT 编译器(如 GraalVM 的
执行:
- 最终生成的二进制文件可以直接在目标平台上运行,无需依赖 JVM。
3. 与 JIT 的对比
| 特性 | AOT 编译 | JIT 编译 |
|---|---|---|
| 编译时机 | 在程序运行之前完成 | 在程序运行时即时完成 |
| 启动性能 | 快速启动,减少初始延迟 | 启动慢,依赖解释器或编译器 |
| 运行时优化 | 无法动态优化 | 可以根据运行时信息优化代码 |
| 目标代码通用性 | 针对特定平台生成 | 字节码具有跨平台能力 |
| 二进制文件体积 | 通常较大 | 仅存储字节码,体积较小 |
4. AOT 的优缺点
优点:
- 启动速度快:
- 编译后的二进制文件是直接可执行的,无需启动 JVM。
- 更低的内存占用:
- 无需 JVM 运行时的额外内存开销。
- 可预期的性能:
- 编译时的优化让性能稳定,不受运行时环境的变化影响。
缺点:
- 缺乏动态优化:
- 无法像 JIT 那样根据运行时的实际情况进行优化。
- 跨平台受限:
- 生成的本地代码仅能在特定的平台上运行,丧失了 Java 的“跨平台”特性。
- 构建时间长:
- AOT 编译通常比字节码编译更耗时。
5. AOT 的实现
5.1 GraalVM 的 native-image
GraalVM 是支持 AOT 编译的 Java 运行时环境,提供了 native-image 工具,可将 Java 应用程序编译为本地可执行文件。
示例:使用 GraalVM 编译应用
编写一个简单的 Java 程序:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, AOT!");
}
}
使用 native-image 进行 AOT 编译:
native-image -cp . HelloWorld
运行生成的二进制文件:
./helloworld
输出:
Hello, AOT!
5.2 其他 AOT 工具
- IBM J9 AOT: 提供 AOT 支持,优化 Java 应用的启动性能。
- Excelsior JET: 第三方工具,已停更,但曾支持 AOT 编译。
6. AOT 的应用场景
- 云原生应用:
- 快速启动的特性非常适合容器化部署的微服务。
- 嵌入式系统:
- 减少对运行时环境(如 JVM)的依赖,降低资源占用。
- 低延迟场景:
- 启动延迟较低的应用,如命令行工具或批处理程序。
7. 总结
- AOT(Ahead-Of-Time)编译 是在程序运行前将字节码转化为本地机器代码的技术,能够显著提升启动性能。
- 优点:启动快、内存占用低、性能稳定。
- 缺点:缺乏运行时优化能力,构建时间较长。
- AOT 编译工具(如 GraalVM 的 native-image)为现代 Java 开发提供了强大的支持,在云原生应用、嵌入式设备等场景中有重要应用。
什么是 Java 的 AOT(Ahead-Of-Time)?的更多相关文章
- java JIT AOT
作者:ETIN链接:https://zhuanlan.zhihu.com/p/27393316来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. I guess anyon ...
- 请一定记得升级java虚拟机
对于吃货出身又需要保持体重的我,出门一定要带男票,因为这样就可以把见到的好吃的都买给他吃,就当是自己吃了[汗].偶尔做梦还是会梦到自己一个角落里偷吃东西,听到有脚步声,抬起头,大哭起来:“我饿了.” ...
- java核心36
1 Java平台 Java采用的是解释和编译混合的模式.它首先通过javac将源码编译成字节码文件class.然后在运行的时候通过解释器或者JIT将字节码转换成最终的机器码.只是用解释器的缺点:抛弃了 ...
- [转] Java 基础
1. 面向对象和面向过程的区别 面向过程 面向对象 2. Java 语言有哪些特点 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 JVM JDK 和 JRE 4. Oracle JDK 和 ...
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对照
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编 ...
- 【转】关于Java基础你不得不会的34个问题
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的 ...
- 面试又被 Java 基础难住了?推荐你看看这篇文章。
本文已经收录自 JavaGuide (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. 1. 面向对象和面向过程的区别 面向过程 :面向过程性能比面 ...
- 学习记录-java基础部分(一)
学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...
- 应届生/社招面试最爱问的几道Java基础问题
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
随机推荐
- Svelte 最新中文文档翻译(4)—— 符文(Runes)下
前言 Svelte,一个非常"有趣".用起来"很爽"的前端框架.从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 ...
- Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
最近DeepSeek开源了对openai-o1的第一代开源推理大模型:deepseek-r1,因其极低的成本和与openai-o1相当的性能引发了国内外的激烈讨论.DD在做独立产品的时候也一直都有用D ...
- 登上国际舞台!天翼云P4 EIP网关流量管理创新方案亮相CCGrid 2024!
5月8日,第24届IEEE/ACM集群.云和互联网计算国际研讨会(CCGrid 2024)在美国费城隆重举行.来自中国.美国.印度.法国等国家的学术及产业界代表齐聚一堂,围绕云计算相关议题进行深入探讨 ...
- split 命令分割超大日志文件
split 命令分割超大日志文件 split -l 1000000 jmeter1432.log part_ 在Windows系统中也可以通过gitbash执行此命令 运行结果:
- 搭建基于Grafana+Prometheus+Node_exporter的性能监控与分析平台(Linux版)
搭建基于Grafana+Prometheus+Node_exporter的性能监控与分析平台(Linux版) 在现代IT环境中,系统监控与分析是确保应用稳定性和高效性的关键.Prometheus与Gr ...
- IDEA 编辑java项目跳过测试
一.Idea配置
- 使用Reids实现简单消息队列
队列操作 简单队列 利用List数据结构可以实现简单的队列,在于使用List提供插入和移除api来完成简单队列操作: 准备数据 获取数据 后入先出 使用redis提供的apiLPOP可以从队列左边获取 ...
- Asp.Net Core3.0 微信退款
参考文档: 微信支付申请退款API文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_11.shtml (最新更新时间:2022 ...
- 探秘Transformer系列之(6)--- token
探秘Transformer系列之(6)--- token 0x00 概述 语言是人类特有的概念.作为一个抽象符号,人是可以理解每个语言单词的意义的,但是现在的NLP语言模型无法直接的从感知中抽象出每个 ...
- Typecho博客添加音乐外链支持Https
首先选个音质和音乐比较全面的音乐站,这里选了网易云音乐,自己手机用的网易云音乐app,存了好多歌单,所以就选他了,但是想获取音乐文件链接,得去这儿:季春二九音乐站 其实很简单,参考下面. 1.先找到网 ...