41

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

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

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

但是,当使用 AOT 跟踪(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none而不是 stdout -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 在多个库中找到同一个类时的行为。

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

4

1 回答 1

-1

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

模块化的库 jar 越多,编译器的最终结果就越小。

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

于 2018-12-21T21:26:33.470 回答