CDS代表Class Data Sharing(类数据共享)。它是在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
或者
$JAVA_HOME/bin/server/classes.jsa
当JVM初始化并且被指示使用CDS时,此存档将用于加载核心类而不是解压缩和验证类,从而提高了启动时间。
动态CDS是什么?
CDS,即类数据共享,是JVM的一个重要特性,可以加快应用程序加载时的启动速度。因为它允许跨不同的JVM共享类元数据,所以减少了启动时间和内存占用。Java 10通过提供AppCDS增强了CDS功能,这使得开发人员能够将应用程序类包含在一个共享存档中。Java 12将CDS存档设为默认设置。
但是创建CDS的过程很繁琐,因为开发人员必须通过多次试验他们的应用程序来创建一个类列表作为第一步,然后将该类列表转储到一个存档中。然后这个存档可以用来在JVM之间共享元数据。
从Java 13开始,Java引入了动态归档功能。现在开发人员可以在应用程序退出时生成一个共享存档。因此不再需要试验运行。
如何创建动态CDS?
以下步骤展示了如何使用选项-XX:ArchiveClassesAtExit
来创建基于默认系统存档之上的动态共享存档,并传递存档名称。
$java -XX:ArchiveClassesAtExit=sharedApp.jar -cp APITester.jar APITester
一旦生成,可以使用-XX:SharedArchiveFile
选项来运行应用程序。
$java -XX:SharedArchiveFile=sharedApp.jar -cp APITester.jar APITester
示例
考虑以下示例:
APITester.java
public class APITester {
public static void main(String[] args) {
System.out.println("Welcome to TutorialsPoint.");
}
}
编译并运行程序
$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
输出:
Welcome to TutorialsPoint.