CDS即Class-Data Sharing
引用:https://docs.oracle.com/en/java/javase/17/vm/class-data-sharing.html#GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91
类数据共享 (CDS) 功能,该功能有助于减少 Java 应用程序的启动时间和内存占用。
类数据共享
类数据共享 (CDS) 功能有助于减少多个 Java 虚拟机 (JVM) 之间的启动时间和内存占用。
-Xshare:dump
,使用 G1 GC 和 128M Java 堆。它使用内置时生成的默认类列表,其中包含选定的核心库 类。默认 CDS 存档位于以下位置:
-
在 Linux 和 macOS 平台上,共享存档存储在
/lib/[arch]/server/classes.jsa
-
在 Windows 平台上,共享存档存储在
/bin/server/classes.jsa
默认情况下,默认 CDS 存档在运行时启用。指定-Xshare:off
禁用默认共享存档。在创建和使用自定义共享存档时,对转储时间和运行时使用相同的 Java 堆大小。
当 JVM 启动时,共享存档是内存映射的,以允许在多个 JVM 进程之间共享这些类的只读 JVM 元数据。因为访问共享存档比加载类更快,所以减少了启动时间。
ZGC、G1、串行和并行垃圾收集器支持类数据共享。
共享 Java 堆对象功能(类数据共享的一部分)仅支持 64 位非 Windows 平台上的 G1 垃圾收集器。
在 Java SE 中包含 CDS 的主要目的是减少启动时间。应用程序相对于它使用的核心类的数量越小,节省的启动时间部分就越大。
-
同一主机上的一部分共享存档被映射为只读并在多个 JVM 进程之间共享。否则,需要在每个 JVM 实例中复制此数据,这会增加应用程序的启动时间。
-
共享存档包含 Java Hotspot VM 使用的形式的类数据。未使用访问运行时模块化映像中的原始类信息所需的内存。这些内存节省允许更多应用程序在同一系统上并发运行。
应用类-数据共享
为了进一步减少启动时间和占用空间,引入了应用程序类数据共享 (AppCDS),它扩展了 CDS 以包括从应用程序类路径中选择的类。
此功能允许将应用程序类放置在共享驱动器中。公共类元数据在不同的 Java 进程之间共享。AppCDS 允许内置系统类加载器、内置平台类加载器和自定义类加载器加载归档类。当多个 JVM 共享同一个归档文件时,可以节省内存并提高整体系统响应时间。
动态 CDS 存档
动态 CDS 归档扩展了应用程序类数据共享 (AppCDS),以允许在 Java 应用程序退出时动态归档类。
它通过消除为每个应用程序创建类列表的试运行来简化 AppCDS 的使用。存档的类包括默认 CDS 存档中不存在的所有加载的应用程序类和库类。
java -XX:ArchiveClassesAtExit=<dynamic archive> -cp <app jar> MyApp
重新生成共享存档
可以为所有支持的平台重新生成共享存档。
随 JDK 安装的默认类列表仅包含一小组核心库类。您可能希望在共享存档中包含其他类。要使用默认 CDS 存档作为基础存档创建动态 CDS 存档,请在命令行中添加以下选项:
java -XX:ArchiveClassesAtExit=<dynamic archive>
在默认系统之上为每个应用程序创建一个单独的动态生成的存档。您可以将动态存档的名称指定为选项的参数 -XX:ArchiveClassesAtExit
。
要重新生成存档文件,请以管理员身份登录。联网情况下,登录一台与Java SE安装相同架构的电脑。确保您有权写入安装目录。
要使用用户定义的类列表重新生成共享存档,请输入以下命令:
java -XX:SharedClassListFile=<class_list_file> -Xshare:dump
生成存档时会打印诊断信息。
手动控制类数据共享
默认情况下启用类数据共享。可以手动启用和禁用此功能。
您可以使用以下命令行选项进行诊断和调试。
-Xshare:off
- 禁用类数据共享。
-Xshare:on
- 启用类数据共享。如果无法启用类数据共享,则打印错误消息并退出。
- 注意:
-Xshare:on仅用于
测试目的。当无法使用 CDS 存档时(例如,更改某些 VM 参数时,或使用不同的 JDK 时),它可能会导致 VM 在启动过程中意外退出。此选项不应在生产环境中使用。 -Xshare:auto
- 默认情况下启用类数据共享。尽可能启用类数据共享。