【问题标题】:JEP 295 AOT: Objects compiled multiple timesJEP 295 AOT:多次编译的对象
【发布时间】:2018-03-16 21:55:10
【问题描述】:

我正在尝试编译具有JDK9's new AOT 功能的应用程序服务器,并且面临许多挑战。

应用服务器由约 180 MB 的 jars 组成;一起编译overflows integer 所以我尝试将每个模块编译为一个(.so)库。这些模块依赖于其他模块,因此我必须使用-J-cp -Jdependencies 将它们放在类路径中。这导致了 4.4 GB 的库 - 因为 AOT 应该加速服务器启动,您可以想象从磁盘加载它并没有真正帮助。 (可以剥离这些库的调试信息,但我们仍在讨论与 jar 相比规模增长的顺序。)

我很失望jaotc 实际上类加载编译的类,这会触发静态构造函数(这有时会给我带来错误)。此外,编译器无法处理缺少的引用类,有时这只是运行时依赖——即使没有它们,服务器也可以正常运行。所以我不得不提供空的模拟类来满足编译器的要求。

但是,当使用 AOT 跟踪(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none,而不是标准输出 -XX:+PrintAOT)运行服务器时,我发现这些库也包含一些依赖项:

found  java.lang.Object  in  /home/user/aot/common/libjava.base-coop.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found  java.lang.Object  in  /home/user/aot/appserver/lib/libcom.example.module1.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800
found  java.lang.Object  in  /home/user/aot/appserver/lib/libcom.example.module2.so for classloader 0x2b5745e6ac80 tid=0x00002b574401e800

这证实了我的怀疑,即 lib 包含的不仅仅是我给编译器编译的 jar 中的代码,但至少还包含超类的代码。我也不确定 JVM 在多个库中找到同一个类时的行为。

是否可以消除重复?大型/多库项目的推荐方法是什么?

【问题讨论】:

  • 你知道 Jet 编译器excelsiorjet.com 吗?在我们公司,我们已经使用它多年了,它从未出现任何兼容性问题。
  • 是的,我在 wiki 上读到过。但是,我专门尝试在此应用服务器上测试 JDK 的功能。此外,非开源是一个障碍。
  • 听起来您没有进行训练以获取要编译的“接触”方法列表。一个不错的博客记录了 AOT 的经验以及有关如何获取已触摸方法列表的详细信息,可以在此处找到:mjg123.github.io/2017/10/02/JVM-startup.html
  • 不,我没有;我想先从完全编译的变体开始。毕竟,如果我不关心磁盘使用情况,我会把所有东西都放进去,JVM 可以从库中挑选它需要的东西。我将尝试使用jcmd VM.print_touched_methods 运行(我已经尝试编译所有加载的类,这给了我 600 MB 的单个库,并且在启动时间上没有区别)。
  • @skomisa 是的,我知道这是实验性的。这并没有取消它作为一项功能的资格。由于除了 JEP 页面之外几乎没有关于此的文档,我正在寻找知道如何使用它的人。

标签: java java-9 aot jep java-aot


【解决方案1】:

在 Java 9 中处理多 jar 依赖关系的推荐方法是模块和模块化 jar。

模块化的库 jar 越多,编译器可以生成的最终结果越小。

https://www.oracle.com/corporate/features/understanding-java-9-modules.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2017-03-10
    • 2018-02-14
    相关资源
    最近更新 更多