请在 2024 年 Clojure 状况调查! 分享您的想法。

欢迎!请查看 关于 页面以了解更多关于这个平台的信息。

+4
编译器
重新贴标签

我一直在阅读关于 AppCDS 的 Oracle 文档,想知道对于 clojure 的核心功能,我们是否可以使用 AppCDS 来创建它们的快照?

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

谢谢,

Sam

1 条答案

+3

我试过它,对启动时间有明显的改善。然而,由于 Clojure 的典型使用和消费方式,使用 AppCDS 的用户体验并不理想。AppCDS 需要预先创建一个等于存档的类列表,并确保生成存档时使用的类路径是运行时代码路径的前缀。

在大多数使用 Clojure 的情况下,尤其是开发时间这个最关键的时期,没有支持选择性确定正确的共享存档(这取决于 Clojure 版本),也没有确保它是类路径的前缀。

此外,在大多数启动速度较慢的Clojure应用程序中,它们之所以速度慢,是因为它们需要读取和编译大量的`.clj`文件(AppCDS不适用),或者它们需要加载AOT'ed(预先编译)的类(AppCDS适用,但只能使用一个存档,因此使用预构建的Clojure存档将防止其工作)。请注意,与AOT'ed代码一起使用通常与开发中的做法相矛盾(通常不是AOT编译或动态重新加载)。

如果您确实想在您的应用程序中使用它,可以对uberjar进行AOT编译,然后使用它生成AppCDS存档并使用它。我怀疑您会看到启动时间的大幅提升。然而,如上所述,这不太可能适合开发(再次强调,这是人们最关心的地方)。

但是,正在进行JEP工作,可能使AppCDS更具灵活性,如https://openjdk.java.net/jeps/350。所以适用性可能最终会改变!

by
另外请注意,截至Java 10,AppCDS不再作为商业特性,而是包含在OpenJDK中。
...