目标是:

  • 创建一个具有自己的JRE(最小化大小)的运行时映像-这就是jlink为我们提供的
  • 创建本机可执行库,而不是使用字节码(缩短加载时间,并希望消除混淆的需求)-这就是jaotc为我们提供的

  • 但是,没有任何好的文档可以将两者联系起来。处理这两种流程似乎有许多相互矛盾的方法。

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

    最佳答案

    并不是的。 JEP-295(jaotc)都没有提及jlink,而JEP-282(jlink)也没有提及jaotc

    但是,由于jlink只会在您的应用程序代码中生成精简的JRE(但它仍然是JRE!),因此可以告诉它使用所需的AOT版本的库。

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

    它没有显示任何错误或警告,因此我相信我没有犯任何可能使结果产生偏差的错误。

    总之,至少就我而言,混合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命令。

    10-08 13:50