AppCDS 自动生成 - 一口 Java
Billy Korando 于 2022 年 9 月 26 日
AppCDS(应用程序类数据共享)是一种改善 Java 应用程序启动性能的简单方法。这是通过 JVM 创建一个预处理的共享存档来完成的,该存档在启动时加载类。自最初发布以来,AppCDS 变得更容易使用,从三步流程变成两步流程,现在借助 JDK 19,AppCDS 可以一步完成。我们来看看 JDK 19 中添加到 AppCDS 的此功能。
AppCDS 概述
当 JVM 启动 Java 应用程序时,类加载器将加载启动应用程序所需的类。对于许多应用程序来说,这可能数以万计的类。每次启动应用程序时,此过程都是相同的,并且由于它会占用大量 CPU 和内存,因此它代表了一个改进机会。
CDS(类数据共享)可以追溯到 JDK 5,其中引导加载器可以在启动时使用 JDK 类的预处理共享存档。在 JDK 10 中,此功能已扩展到包括应用程序类。
从预处理存档加载类可以显著改善启动性能。但是,具体改进取决于以下因素:应用程序大小、启动行为、硬件等。此外,该存档是内存映射的,允许在同一主机上运行并使用同一共享存档的其他 JVM 进程使用同一内存地址。AppCDS 也非常健壮,因为 JVM 在默认情况下会静默忽略在尝试从共享存档加载类时遇到的问题,并回退到从文件系统加载类。
自 JDK 10 中添加以来,AppCDS 已经逐步取得进展。最初,创建和使用共享存档是一个三步流程:创建要存档的类列表、生成存档,然后使用该存档。此过程在 JDK 13 中作为两步流程进行了改进,将创建要存档的类列表和生成存档合并为一步。但是,即使是这个相对简单的过程,在 JDK 版本之间升级时也会出现问题,因为共享存档需要重新生成,因为共享存档的 JDK 版本需要与 JVM 的 JDK 版本匹配。
自动生成存档
JDK 19 引入了自动生成存档的功能。在 JDK 19 中,创建和使用存档不再是两个独立的步骤,而是可以将它们合并为一步,从而允许在创建和使用共享存档时使用相同的 java
启动命令。以下命令演示如何使用自动生成功能
java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=my-archive.jsa Main
JVM 将在启动时检查 SharedArchiveFile
位置以查找共享存档。如果存在,JVM 将从共享存档加载。如果存档不存在,JVM 将在退出时在 SharedArchiveFile
位置生成一个共享存档。JVM 还会检查构建共享存档所用的 JDK 版本。如果版本与 JVM 版本不匹配,JVM 将在退出时生成一个新的共享存档并覆盖现有的存档。
将创建和使用共享存档的过程简化为一个步骤,将使在 JDK 版本之间升级变得更加容易。
延伸阅读
编码愉快!