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) 之间的启动时间和内存占用。

  从 JDK 12 开始,默认的 CDS 归档文件与 Oracle JDK 二进制文件一起预先打包。默认 CDS 存档是在 JDK 构建时通过运行创建的-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 实例的占用成本已通过两种方式降低:
  1. 同一主机上的一部分共享存档被映射为只读并在多个 JVM 进程之间共享。否则,需要在每个 JVM 实例中复制此数据,这会增加应用程序的启动时间。

  2. 共享存档包含 Java Hotspot VM 使用的形式的类数据。未使用访问运行时模块化映像中的原始类信息所需的内存。这些内存节省允许更多应用程序在同一系统上并发运行。

应用类-数据共享

  为了进一步减少启动时间和占用空间,引入了应用程序类数据共享 (AppCDS),它扩展了 CDS 以包括从应用程序类路径中选择的类。

  此功能允许将应用程序类放置在共享驱动器中。公共类元数据在不同的 Java 进程之间共享。AppCDS 允许内置系统类加载器、内置平台类加载器和自定义类加载器加载归档类。当多个 JVM 共享同一个归档文件时,可以节省内存并提高整体系统响应时间。

动态 CDS 存档

  动态 CDS 归档扩展了应用程序类数据共享 (AppCDS),以允许在 Java 应用程序退出时动态归档类。

  它通过消除为每个应用程序创建类列表的试运行来简化 AppCDS 的使用。存档的类包括默认 CDS 存档中不存在的所有加载的应用程序类和库类。

要创建动态 CDS 存档,请使用以下命令运行 Java 应用程序:
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
默认情况下启用类数据共享。尽可能启用类数据共享。
posted @ 2023-03-12 15:25  使用D  阅读(518)  评论(0编辑  收藏  举报