4

这里的目标是:

  1. 创建一个运行时映像,它自己剥离了 JRE(最小化大小)——这就是 jlink 给我们的

  2. 创建本机可执行库而不是使用字节码(改善加载时间并希望消除混淆的需要)——这就是 jaotc 给我们的

但是,没有任何好的文档可以将两者关联起来。似乎有很多矛盾的方式来处理这两个流程。

是否可以使用使用 jaotc 生成的二进制文件的 jlink 构建运行时映像?

4

1 回答 1

4

并不真地。JEP-295 (jaotc) 均未提及,jlinkJEP -282 (jlink) 均未提及jaotc

然而,因为jlink只是用您的应用程序代码生成了一个精简的 JRE(但它仍然是一个 JRE!),所以可以告诉它使用您想要的 AOT ed 库。

我决定按照 JEP-295 中所述为模块生成本机 AOT 库的过程,然后通过如下设置java.base更改jlink-generated 启动器:bin/my-appJLINK_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"

它没有显示任何错误或警告,因此我相信我没有犯某种可能会扭曲结果的错误。

总之,至少在我的情况下,混合似乎jlinkjaotc没有产生积极的影响,但请注意,在jaotcJEP 中他们确实说过:

AOT compilation of any JDK modules, classes, or of user code,
is experimental and not supported in JDK 9

所以,我想说现在下判断还为时过早(截至撰写本文时为 2018 年 5 月)……让我们给他们时间来完善这个机制,并希望他们能够取得更多的改进。

目前,加速应用程序的更有希望的方法可能是使用GraalVM及其native-image命令。

于 2018-05-07T21:24:16.307 回答