天天看点

OpenJDK HotSpot或将在Java 9带来预编译技术

在“什么是即时编译(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工具支持以下这些标记:

产品级的jvm有如下标记:

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

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

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

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