目标是:
但是,没有任何好的文档可以将两者联系起来。处理这两种流程似乎有许多相互矛盾的方法。
是否可以使用使用jaotc生成的二进制文件的jlink构建运行时映像?
最佳答案
并不是的。 JEP-295(jaotc)都没有提及jlink
,而JEP-282(jlink)也没有提及jaotc
。
但是,由于jlink
只会在您的应用程序代码中生成精简的JRE(但它仍然是JRE!),因此可以告诉它使用所需的AOT版本的库。
我决定按照该步骤为JEP-295中所述的java.base
模块生成本机AOT库,然后通过如下设置jlink
来更改bin/my-app
上JLINK_VM_OPTIONS
生成的启动器:
JLINK_VM_OPTIONS=-XX:AOTLibrary=./libjava.base-coop.so
然后,我使用
time bin/my-app
运行启动器,该启动器针对localhost上的服务器发出HTTP请求(以避免网络延迟),然后打印完整的HTTP响应。AOT大约需要410毫秒,而没有AOT则需要210毫秒!
为了确认AOT是否被正确拾取,我添加了一些诊断标志:
JLINK_VM_OPTIONS="-XX:+UnlockDiagnosticVMOptions -XX:AOTLibrary=./libjava.base-coop.so -XX:+UseAOTStrictLoading"
它没有显示任何错误或警告,因此我相信我没有犯任何可能使结果产生偏差的错误。
总之,至少就我而言,混合
jlink
和jaotc
似乎没有积极影响,但是请注意,在jaotc
JEP中,他们确实说过:AOT compilation of any JDK modules, classes, or of user code,
is experimental and not supported in JDK 9
因此,我要说判断还为时过早(2018年5月)...让他们有时间完善这种机制,并希望他们能够实现更多的改进。
目前,加快应用程序速度的更可行的方法可能是使用GraalVM及其
native-image
命令。