AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

OpenJDK HotSpot 或将在 Java 9 带来预先编译技术(AOT)

  • 2016-10-10
  • 本文字数:1647 字

    阅读完需:约 5 分钟

在“什么是即时编译(JIT)!?OpenJDK HotSpot VM 剖析”这篇文章里,作者提到HotSpot 执行引擎有一个即时(JIT)编译器。为了优化启动时间,分层编译先对代码进行解释,然后把它们快速移动到第1 层,第2 层和第3 层,在这些层里使用客户端编译级别对它们进行编译(使用不同的剖析信息),最后把它们移动到服务端编译级别的层(更多信息可以参考上面的文章)。尽管有编译阶段的优化,HotSpot 仍然会先解释执行字节码,然后才会使用即时编译。

今年9 月,一个关于在HotSpot 里添加预先编译(Ahead-of-Time,AOT)的提案被提交到JEP。AOT 通过加载预编译的类来优化启动时间,避免了在解释模式或局部优化编译级别运行这些类。

AOT 并非新出现的动态编译器技术。 IBM 的 J9 虚拟机就支持 AOT Excelsior JET 和其它一些虚拟机也支持。AOT 使用(共享)已经编译成本地代码的库让动态编译器达到更好的启动 / 预热效果。

跟 JIT 编译器类似,AOT 编译也有分层和非分层两种模式,不同之处在于剖析信息和 JIT 再编译。那篇文章提到,在分层模式下,编译第2 层会收集简单的剖析信息,AOT 分层编译的代码也是如此。当AOT 调用达到一定阈值,这些方法会在第3 层被客户端编译器编译,这也为将在第4 层发生的服务端再编译收集了全部剖析信息。

该提案由HotSpot 团队负责人Valdimir Kozlov 提交,里面提到了在第一个版本里只有java.base 模块支持多层AOT,因为这个基本模块为众人所知,可以得到全面的内部测试。

AOT 带来了一个叫作“jaotc”的工具,它在内部使用了 Graal (用于生成代码)。Graal 动态编译器集成了 HotSpot 虚拟机并且依赖 JVM 编译器接口(JVMCI),所以 JDK(支持 Graal 或 AOT)应该也支持 JVMCI。 Oracle technetwork 网站上就有一些支持 JVMCI 的 JDK 版本。

根据提案的描述,jaotc 工具支持以下这些标记:

复制代码
--module <name> Module to compile
--output <file> Output file name
--compile-commands <file> Name of file with compile commands
--compile-for-tiered Generated profiling code for tiered compilation
--classpath <path> Specify where to find user class files
--threads <number> Number of compilation threads to be used
--ignore-errors Ignores all exceptions thrown during class loading
--exit-on-error Exit on compilation errors
--info Print information during compilation
--verbose Print verbose information
--debug Print debug information
--help Print this usage message
--version Version information
-J<flag> Pass <flag> directly to the runtime system
</flag></flag></number></path></file></file></name>

产品级的 JVM 有如下标记:

复制代码
+/-UseAOT - Use AOT-compiled files
+/-PrintAOT - Print used AOT klasses and methods
AOTLibrary=<file> - Specify the AOT library file
</file>

一些非产品级或用于开发的标记对用户也是可用的:

复制代码
PrintAOTStatistics - Print AOT statistics
UseAOTStrictLoading - Exit the VM if any of the AOT libraries has invalid config

提案同时提到,AOT 的运行时事件日志将集成统一 GC 日志,并支持如下标签:

复制代码
aotclassfingerprint
aotclassload
aotclassresolve

不列出风险或没有基本假定的提案是不完整的,AOT 也不例外。AOT 提案的风险标注如下:

预编译的代码可能不是最优的,所以会导致性能损失。性能测试结果表明,有些应用程序会从 AOT 编译的代码中获益,不过有些却出现明显的性能衰退。因为 AOT 特性是可选的,所以应用程序出现的性能衰退是可以避免的。如果用户发现应用程序启动变慢,或者达不到预期的性能峰值,那么可以重新构建一个不包含 AOT 库的 JDK。

查看英文原文: Ahead-of-Time (AOT) Compilation May Come to OpenJDK HotSpot in Java 9


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-10-10 19:005200
用户头像

发布了 322 篇内容, 共 151.8 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

Windows、Linux、Apple三大操作系统的主流文件系统包含哪些?

Ethereal

国家产业政策不断加码,氢能步入加速发展期

易观分析

氢能源 氢能源产业

错误码设计思考

木小风

Java 架构 错误码

企业如何挖掘知识“金矿”?这本白皮书讲得够透彻!

百度大脑

从0到1落地电商小程序之微服务设计

晨亮

「架构实战营」

自动化知识图谱表示:从三元组到子图

第四范式开发者社区

人工智能 自动化 知识图谱

Python 的排序方法 sort 和 sorted 的区别

AlwaysBeta

Python

什么是数据恢复?数据丢失的最常见原因有哪些?

Ethereal

浅谈信息熵在数字体验监控领域的应用

博睿数据

治理有精度,AI赋智加强城市精细化管理

百度大脑

详细的网站定制步骤有哪些?

源字节1号

网站开发 软件定制

从建好到用好,阿里云原生微服务生态的演进

阿里巴巴云原生

提升客户服务体验的技巧

小炮

客户服务 SaaS平台

恒源云(GpuShare)_租卡怎么选?看这一篇就够了!

恒源云

人工智能 GPU服务器

Kubernetes中API的不同版本, Alpha, Beta, Stable 都是什么?

工程师薛昭君

Kubernetes API

手把手教你从Apk中取出算法

奋飞安全

android 安全 java

Java AOT之GraalVM native image介绍以及简单长连接服务实践

BUG侦探

GraalVM java aot native image

TDesign React Starter 发布

TDesign

Go 中的空白标识符(下划线)

宇宙之一粟

Go 语言 3月月更

客户画像赋能百度推广生态实践

百度Geek说

前端 后端

弱监督语义分割:从图像级标注快进到像素级预测

网易云信

安全

Nginx限速模块初探

喀拉峻

nginx

ABAP 获取本地路径

Jasen Ye

abap 文件路径

Apache ShardingSphere 5.1.0 执行引擎性能优化揭秘

SphereEx

数据库 ShardingSphere SphereEx apache 社区

产品升级|1-2月合刊:多款重磅产品来袭

百度大脑

地狱开局的2022,穿好你的安全铠甲

脑极体

网络安全入门5天速成教程: WEB安全渗透攻防技术

网络安全学海

网络安全 安全 信息安全 渗透测试 WEB安全

【愚公系列】2022年03月 Docker容器 Kafka集群的搭建

愚公搬代码

3月月更

延期通知 RocketMQ Summit 议题全揭秘

阿里巴巴云原生

AI+遥感智能解译,赋能智慧城市规划革新

百度大脑

无监控不运维—浅述各种监控方案使用场景

穿过生命散发芬芳

3月月更

OpenJDK HotSpot或将在Java 9带来预先编译技术(AOT)_Java_Monica Beckwith_InfoQ精选文章