java - JEP 295 AOT : Objects compiled multiple times

标签 java java-9 aot jep java-aot

我正在尝试用 JDK9's new AOT 编译一个应用服务器功能,并且面临着许多挑战。

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

令我非常失望的是,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 不仅包含我给编译器编译的 jars 中的代码,而且至少还包含父类(super class)的代码。我也不确定 JVM 在多个库中找到相同类时的行为。

是否有可能去除口是心非?大型/多库项目的推荐方法是什么?

最佳答案

此功能已被 JEP410 删除.与 AOT 相关的代码大部分在 JDK 17 中被删除,你不应该使用这个特性。如果你还想要这个功能,可以考虑使用GraalVM .

关于java - JEP 295 AOT : Objects compiled multiple times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582922/

相关文章:

java - 关于TLS加密的查询

java - 无法使用 FTP 客户端通过二进制传输方式传输文件

java - NoSuchMethodException : springframework. boot.autoconfigure.http.HttpMessageConverters

angular - Angular 构建中的 AOT 模式添加 `fr.` 或 `en.` 作为 transloco 中翻译键的前缀

java - 日期时间转换为日期时显示不同的日期

java - Jmeter以重复的方式顺序运行单个线程组

java - 循环模块依赖在 Java 9 中是否可行?

java - Java 9 中的新关键字

android - 为什么Android AOT编译只在安装时进行

angular - 在 Angular 中使用 SystemJs 导入时找不到模块