Java 简明教程

Java - Dynamic CDS

What is CDS?

CDS 代表类数据共享。它在 JDK 5 中引入,通过加载核心类和共享 JVM 元数据的预处理归档来改进 JVM 的启动时间。当 JVM 初始化时,它会加载一组核心类,例如 java.lang 包类。使用 CDS,Java 支持为这些核心类创建一个预处理归档,以便可以通过直接使用预处理归档来改进初始化的正常流程(展开归档、验证类、生成字节码)。以下命令可从 JDK 5 开始使用,以创建一个 CDS 归档,供 JVM 在启动时使用。

$java -Xshare:dump -cp APITester.jar APITester

CDS 归档将存在于 JAVA 安装目录中。

$JAVA_HOME/lib/server/classes.jsa
or
$JAVA_HOME/bin/server/classes.jsa

当 JVM 初始化并被定向使用 CDS 时,此归档将用于加载核心类,而不是解压和验证类,从而提高启动时间。

What is Dynamic CDS?

CDS(类数据共享)是 JVM 的一项重要功能,可提升应用程序加载的启动时间。因为它允许在不同的 JVM 之间共享类元数据,从而缩短启动时间并降低内存占用。Java 10 通过提供 AppCDS(应用程序 CDS)增强了 CDS,它允许开发人员访问在共享归档中包含应用程序类。Java 12 将 CDS 归档设为默认值。

但是,创建 CDS 的过程很繁琐,因为开发人员必须对其应用程序进行多次试验才能在第一步创建类列表,然后将该类列表转储到归档中。然后,此归档可用于在 JVM 之间共享元数据。

自 Java 13 起,Java 现在具有动态归档。现在,开发人员可以在应用程序退出时生成共享归档。因此,不再需要试运行。

Create Dynamic CDS?

以下步骤展示了如何使用选项 -XX:ArchiveClassesAtExit 创建基于默认系统归档的动态共享归档,并传递归档名称。

$java -XX:ArchiveClassesAtExit=sharedApp.jar -cp APITester.jar APITester

生成共享归档后,可以使用 -XX:SharedArchiveFile 选项来运行应用程序。

$java -XX:SharedArchiveFile=sharedApp.jar -cp APITester.jar APITester

Example

考虑以下示例 −

APITester.java

public class APITester {
   public static void main(String[] args) {
      System.out.println("Welcome to TutorialsPoint.");
   }
}

Compile and Run the program

$javac APITester.java

$jar cf APITester.jar APITester.class

$java -XX:ArchiveClassesAtExit=sharedApp.jsa -cp APITester.jar APITester

$java -XX:SharedArchiveFile=sharedApp.jsa -cp APITester.jar APITester

Output

Welcome to TutorialsPoint.