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

欢迎!请参阅关于页面以获取更多关于该功能的详情。

+4
编译器
重新标记

我一直在阅读 Oracle 关于 AppCDS 的文档,想知道对于 Clojure 的核心功能,我们能否使用 AppCDS 进行快照?

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

谢谢,

Sam

1 答案

+3

我试过了,确实可以显著提高启动速度。然而,考虑到 Clojure 的典型使用方式,其使用 ergonomics 并不理想。AppCDS 需要预先创建一个要存档的类列表,并且确保用于生成存档的类路径在运行时类路径之前。

在当前使用 Clojure 的大多数场合中,尤其是在开发时间这种最需要的时候,没有关于如何选择正确的共享存档的支撑(这取决于 Clojure 版本),也没有确保它是类路径前缀的支撑。

此外,大多数启动缓慢的Clojure应用程序之所以缓慢,是因为它们可能需要读取和编译大量的clj文件(AppCDS不适用)或者需要加载AOT(先行编译)类(AppCDS适用,但您只能使用一个存档,因此使用预构建的Clojure存档会阻止这种功能的使用)。请注意,在使用AOT代码时通常是与发展过程中的工作相矛盾的(通常不是AOT编译或动态重新加载)。

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

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

值得注意的是,截至Java 10,AppCDS不再是商业特性,已包含在OpenJDK中。
...