我正在尝试使用JDK9的新AOT功能编译应用程序服务器,并且面临许多挑战。
应用程序由〜180 MB罐子组成;将其整合在一起溢出整数,因此我尝试将每个模块编译为一个(.so)库。这些模块对其他模块具有依赖性,因此我必须使用-J-cp -J
依赖项将它们放在classPath上。这导致了4.4 GB的LIBS-由于AOT应该加快服务器启动,您可以想象,从磁盘上加载它并没有真正的帮助。(可以剥离这些调试信息的图书馆,但是与罐子相比,我们仍在谈论规模增长。)
我对jaotc
实际上汇编的类,这使我感到失望,这会触发静态构造函数(这有时会给我带来错误)。同样,编译器无法处理缺少的参考类,有时这只是一个依赖运行时 - 服务器即使没有问题也没有问题。因此,我必须提供空的模拟课程以满足编译器。
但是,使用AOT跟踪运行服务器时(-Xlog:aot+class+load=trace:file=/tmp/aot.txt:none
,而不是STDOUT -XX:+PrintAOT
),我发现Libs也包含依赖项的某些部分:
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不仅包含我给编译器编译的罐子中的代码,但至少也至少也是超级类的代码。我也不确定JVM在多个libs中找到同一类时的行为。
有可能剥离重复性吗?大/多LIB项目的推荐方法是什么?
此功能已由JEP410删除。与AOT相关的代码大多在JDK 17中删除,您不应使用此功能。如果您仍然需要此功能,则可以考虑使用GRAALVM。