JEP 295 AOT:多次编译对象
我正在尝试使用JDK9的新AOT功能编译应用程序服务器,并且面临着许多挑战。
该应用程序服务器由~180 MB的jar组成;将其编译在一起会溢出整数,因此我尝试将每个模块编译为一个(.so)库。这些模块对其他模块具有依赖关系,因此我必须使用依赖关系将它们放在类路径上。这导致了4.4 GB的libs - 由于AOT应该加快服务器启动速度,您可以想象从磁盘加载它并没有真正帮助。(可以删除这些库的调试信息,但与jar相比,我们仍然在谈论规模增长的顺序。-J-cp -J
我相当失望的是,实际上类加载编译类,这会触发静态构造函数(这有时会给我带来错误)。此外,编译器无法处理缺少的引用类,有时这只是运行时依赖关系 - 即使没有它们,服务器也可以毫无问题地运行。因此,我必须提供空的模拟类来满足编译器的要求。jaotc
但是,当使用AOT跟踪(而不是stdout)运行服务器时,我发现libs也包含某些依赖项:-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在多个库中找到同一类时的行为。
是否有可能剥离双重性?大型/多库项目的推荐方法是什么?