您可以将 jaotc(Java 预编译器)与 jlink(模块 assembler/optimizer 创建运行时映像)一起使用吗?

Can you use jaotc (Java Ahead-of-Time Compiler) with jlink (module assembler/optimizer to create runtime images)?

这里的目标是:

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

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

但是,没有任何好的文档将两者相关联。使用这两个流程似乎有很多相互矛盾的方法。

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

不是真的。 JEP-295 (jaotc) mentions jlink, nor JEP-282 (jlink) 都没有提到 jaotc.

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

我决定按照 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,它对本地主机上的服务器发出 HTTP 请求(以避免网络延迟),然后打印完整的 HTTP 响应。

使用 AOT 大约需要 410 毫秒,没有它需要 210 毫秒!

为了确认 AOT 被正确拾取,我添加了一些诊断标志:

JLINK_VM_OPTIONS="-XX:+UnlockDiagnosticVMOptions -XX:AOTLibrary=./libjava.base-coop.so -XX:+UseAOTStrictLoading"

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

总而言之,至少在我看来,混合使用 jlinkjaotc 似乎没有产生积极的影响,但请注意,在 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 命令。