Java JEP 295 AOT:多次编译的对象

Java JEP 295 AOT:多次编译的对象,java,java-9,aot,jep,java-aot,Java,Java 9,Aot,Jep,Java Aot,我正在尝试编译一个具有此功能的应用程序服务器,并且面临许多挑战 appserver由约180 MB JAR组成;一起编译,所以我尝试将每个模块编译成一个(.so)库。这些模块与其他模块有依赖关系,因此我必须使用-J-cp-J依赖关系将它们放在类路径上。这导致了4.4GB的libs—因为AOT应该加快服务器引导速度,所以可以想象从磁盘加载它并没有真正的帮助。(可以去掉这些库的调试信息,但我们仍然在讨论与JAR相比的规模增长顺序。) 我相当失望,jaotc实际上类加载编译的类,这会触发静态构造函数(

我正在尝试编译一个具有此功能的应用程序服务器,并且面临许多挑战

appserver由约180 MB JAR组成;一起编译,所以我尝试将每个模块编译成一个(.so)库。这些模块与其他模块有依赖关系,因此我必须使用
-J-cp-J
依赖关系将它们放在类路径上。这导致了4.4GB的libs—因为AOT应该加快服务器引导速度,所以可以想象从磁盘加载它并没有真正的帮助。(可以去掉这些库的调试信息,但我们仍然在讨论与JAR相比的规模增长顺序。)

我相当失望,
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包含的不仅仅是我给编译器编译的jar中的代码,而且至少还有超类的代码。我也不确定JVM在多个LIB中找到同一个类时的行为


有没有可能去掉口是心非的东西?大型/多库项目的推荐方法是什么?

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

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


您知道Jet编译器吗?在我们公司,我们已经使用它很多年了,它从来没有出现任何兼容性问题。是的,我在维基上读到过。然而,我特别尝试在这个应用服务器上测试JDK的功能。此外,非开源软件是一个拦截器。听起来你没有做过训练来获得要编译的“接触”方法列表。在这里可以找到一个很好的博客,它记录了AOT的使用经验以及关于如何获得触摸方法列表的详细信息:不,我没有;我想先从完全编译的变体开始。毕竟,如果我不关心磁盘使用情况,我会让所有东西都进来,JVM可以从libs中选择它需要的东西。我将尝试使用
jcmd VM.print\u moucted\u方法运行(我已经尝试编译了所有加载的类,这些类为我提供了600 MB的单个库,并且在启动时间上没有差异)。@skomisa是的,我知道这是实验性的。这并不意味着这是一个特性。由于除了JEP页面之外,几乎没有关于这方面的文档,我正在寻找一个知道如何使用它的人。