什么是 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程序员所需要掌握的核心知识)如果觉得不错 ...
随机推荐
- vue3.5保证你看得明明白白
子组件中设置默认属性 <template> <div class="child-page"> <h1>我是子组件</h1> < ...
- EasyExcel 通过模板填充数据
EasyExcel 通过模板填充数据两种方式:1.直接通过模板填充.2.通过IO流填充. 模板示例 注意:单个字段填充只写字段名即可,数据集填充需要在字段前加 . {title} 姓名 昵称 手机号 ...
- 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
1 大人,时代变了! 赶快把自有业务的本地AI"模型"训练起来! 1.1 背景 目前AI已经大行其道,chatGPT.DeepSeek等如雨后春笋般涌现出来,笔者做为一个守旧派 ...
- Google 助手安装
转自:https://www.jianshu.com/p/6086ec29c173 今天这篇推送可能是很多人都需要的,因为它能帮助你无阻碍的访问Google.Google scholar.Gmail. ...
- 越“挖”越有料,天翼云“息壤”助攻DeepSeek变身万能搭子!
还在为DeepSeek服务器繁忙而抓狂? 还在为API调用费用涨价而头疼? 还在为数据安全而担忧? 别急! 天翼云"息壤"算力互联调度平台出马 全面解锁DeepSeek新玩法 带你 ...
- 论今日,Vue VSCode Snippets 不进行代码提示的问题 或 vetur Request textDocument/documentSymbol failed.
这他喵的是因为 vetur 这个鬼东西升级了,然后和项目中某些包不匹配了, 降级就好了, 法克尤啊法克尤,我整了一天,大概是坏了吧 灵感来源:https://cxymm.net/article/a84 ...
- 利用JS 代码块 为你的 Typecho博客添加一个 Copy 按钮
引入 JS 将以下代码添加到主题 header.php 中的 </head> 标签前,本主题也可以前往 控制台 - 设置外观 - 主题自定义扩展,将它添加到 自定义 HTML 元素拓展 - ...
- [SWPUCTF 2021 新生赛]ez_unserialize
概括 这是一道PHP反序列化的CTF赛题,本意是想用这道题对PHP反序列化进行一定的学习. 过程 我们打开赛题,看看内容 没有发现什么东西,看看他的页面代码 根据他的提示,感觉是存在一个robots. ...
- css 保留后端 textarea 中的换行与空格字符
原文链接:https://blog.jijian.link/2020-10-22/css-pre/ 如果后台使用 textarea 输入内容,在前段显示需要保留换行符与空白字符,该如何做? 常规方法 ...
- hexo 图片添加水印(png, jpeg, jpg, gif)
文章同步发布:https://blog.jijian.link/2020-04-21/hexo-watermark/ 本文折腾 hexo 图片添加水印功能,大部分代码沿用: nodejs 图片添加水印 ...