这里的目标是:
创建一个运行时映像,它自己剥离了 JRE(最小化大小)——这就是 jlink 给我们的
创建本机可执行库而不是使用字节码(改善加载时间并希望消除混淆的需要)——这就是 jaotc 给我们的
但是,没有任何好的文档可以将两者关联起来。似乎有很多矛盾的方式来处理这两个流程。
是否可以使用使用 jaotc 生成的二进制文件的 jlink 构建运行时映像?
并不真地。JEP-295 (jaotc) 均未提及,jlink
JEP -282 (jlink) 均未提及jaotc
。
然而,因为jlink
只是用您的应用程序代码生成了一个精简的 JRE(但它仍然是一个 JRE!),所以可以告诉它使用您想要的 AOT ed 库。
我决定按照 JEP-295 中所述为模块生成本机 AOT 库的过程,然后通过如下设置java.base
更改jlink
-generated 启动器:bin/my-app
JLINK_VM_OPTIONS
JLINK_VM_OPTIONS=-XX:AOTLibrary=./libjava.base-coop.so
然后我用 运行我的启动器time bin/my-app
,它向 localhost 上的服务器发出 HTTP 请求(以避免网络延迟),然后打印完整的 HTTP 响应。
使用 AOT 大约需要 410 毫秒,没有它需要 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
命令。