写点什么

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

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

关注

评论

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

IIS 部署静态网站和 FTP 服务

乌龟哥哥

6月月更

我大抵是卷上瘾了,横竖睡不着!竟让一个Bug,搞我两次!

小傅哥

小傅哥 异常 bug 连接池 面试问题

优博讯出席OpenHarmony技术日,全新打造下一代安全支付终端

极客天地

TopoLVM: 基于LVM的Kubernetes本地持久化方案,容量感知,动态创建PV,轻松使用本地磁盘

大卡尔

Kubernetes 云原生 6月月更

基于STM32设计的蓝牙健康管理设备

DS小龙哥

6月月更

Vue3+ElementPlus+Axios实现从后端请求数据并渲染

Python研究所

6月月更

政策关注 | 加快构建数据基础制度,维护国家数据安全

青藤云安全

数据治理 数据安全

Rxjs mergeMap 的使用场合

汪子熙

typescript 响应式编程 angular RXJS 6月月更

flutter系列之:flutter中的flow

程序那些事

flutter 程序那些事 6月月更

TDengine 邀请函:做用技术改变世界的超级英雄,成为 TD Hero

TDengine

数据库 tdengine

红包雨: Redis 和 Lua 的奇妙邂逅

勇哥java实战分享

SpringCloud - Eureka核心源码解析

码农参上

微服务 SpringCloud Eureka 注册中心

JavaScript 回调函数/Promise/ async/await

源字节1号

软件开发 前端开发 后端开发

Spring Boot零配置启动原理

码农参上

Spring Cloud springboot

Future & CompletionService

Ayue、

多线程 Future接口

EMQ携手谐云,打造车联网平台联合解决方案

EMQ映云科技

车联网 物联网 IoT 兼容性测试 6月月更

【值得收藏】Centos7 安装mysql完整操作命令

迷彩

MySQL 数据库 centos 6月月更

maven编译遇到"编码GBK的不可映射字符"警告的处理

程序员欣宸

Java maven 6月月更

直播电子商务应用程序开发需要什么基本功能?未来发展前景如何?

开源直播系统源码

软件开发 直播源码 带货直播

华为开启2022全球校园AI算法精英大赛 百万奖金等你来挑战算法极限

科技汇

web前端培训组件内部数据state的知识点分享

@零度

前端开发 state

Drive to APasS!使用明道云管理F1赛事

明道云

前端食堂技术周刊第 42 期:Vue 2.7 Beta、TS 4.8 Beta、React 开源奖、ECMAScript 2022

童欧巴

JavaScript typescript Vue 前端 React

预约直播 | 主流视觉算法介绍及在PAI上的应用

阿里云大数据AI技术

机器学习 视觉算法

居家办公竟比去公司上班还累? | 社区征文

架构精进之路

初夏征文

在外企远程办公是什么体验? | 社区征文

Geek_rze78a

Java 程序员 远程办公 外企 初夏征文

SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道!

博文视点Broadview

大数据培训Scala 类和对象知识与案例分享

@零度

scala 大数据

Elasticsearch 在地理信息空间索引的探索和演进

vivo互联网技术

elasticsearch 数据分析 数据检索

面试突击60:什么情况会导致 MySQL 索引失效?

王磊

Java MySQL 面试

Salesforce 容器化 ISV 场景下的软件供应链安全落地实践

阿里巴巴中间件

阿里云 容器 云原生

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