报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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:005019
用户头像

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

关注

评论

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

细说GaussDB(DWS)复杂多样的资源负载管理手段

华为云开发者联盟

数据库 并发 CPU管控

整整面试两月,凭借这份15w字Java面试刷题宝典成功入职阿里

Java全栈架构师

Java spring 程序员 面试 算法

国内酒店交易DDD应用与实践——理论篇

Qunar技术沙龙

DevCloud加持下的青软,让教育“智”上云端

华为云开发者联盟

云计算 软件 后端 开发 教育

小暑至,盛夏始,7月月更活动伴随着盛夏走来啦!

InfoQ写作社区官方

热门活动 7月月更

“造车”,腾讯抄了华为后路

科技新知

60天远程办公经验分享 | 社区征文

Albert

初夏征文

什么是IGMP?IGMP与ICMP有啥区别?

wljslmz

网络协议 6月月更 IGMP 组播

远程沟通高效的自我总结| 社区征文

卢卡多多

初夏征文

小程序容器是什么技术?能助力物联网企业红海突围?

Speedoooo

小程序 物联网 IoT 小程序容器

福昕软件受邀亮相2022先进制造业数智发展论坛

联营汇聚

VoIP Push 在海外音视频业务中的应用

融云 RongCloud

leetcode 416. Partition Equal Subset Sum 分割等和子集(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

微博系统中”微博评论“的高性能高可用计算架构

Geek_e8bfe4

软件快速交付真的需要以安全为代价吗?

华为云开发者联盟

云计算 敏捷 安全 后端 开发

web3 的身份验证之以太坊签名消息

devpoint

区块链 以太坊 Web3.0 6月月更

攻防演练中的防守基石——全方位监控

穿过生命散发芬芳

6月月更 攻防演练

透过华为军团看科技之变(五):智慧园区

脑极体

架构实战营模块 5 作业

Naoki

架构实战营

第八届“互联网+”大赛 | 云原生赛道邀你来挑战

阿里巴巴云原生

阿里云 云原生 大赛

jfinal中如何使用过滤器监控Druid监听SQL执行?

华为云开发者联盟

sql 开发

MySQL,MVCC详解,快照读在RC、RR下的区别

乌龟哥哥

6月月更

M1笔记本居家办公的痛点及解决方案 | 社区征文

IT蜗壳-Tango

6月月更 初夏征文

小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

阿里云大数据AI技术

sql 大数据 分布式计算

华为云AOM 2.0版本发布

华为云开发者联盟

运维 华为云 自动化运维 AOM

如何使用物联网低代码平台进行服务管理?

AIRIOT

低代码 物联网 低代码开发平台 低代码平台

CorelDRAW2022全新版V24.1.0.360更新

茶色酒

cdr2022

linux之ClamAV杀毒软件安装配置

入门小站

Linux

洞见科技作为「唯一」隐私计算数商,「首批」入驻长三角数据要素流通服务平台

洞见科技

架构实战营毕业总结

哈喽

「架构实战营」

从一个被应用商店坑了的BUG说起

IT蜗壳-Tango

自动化测试 IT蜗壳教学 6月月更

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