Java中的数据共享
当使用类数据共享(CDS)时,几个Java虚拟机可以共享加载的类的内存。
从Java 1.5开始,Sun JVM就包含了一个CDS。然而,它很少被使用,因为它只适用于系统类和串行垃圾收集器。
Oracle JDK 9中额外的GC技术和应用类使情况大为改观。这在JDK 10之前是一个付费功能。
利用CDS时,类被存储在一个内存映射的文件中。由于该类的内部表示被几个JVM共享,所以加载速度更快。
什么是数据类共享
我们可以使用类信息或数据共享(CDS)来操作许多Java虚拟机。只要有Oracle Java Runtime Environment(JRE)的安装,就会加载默认类。
之后,所有的东西都被复制并存储在一个中心位置。因此,在建立共享档案之前,你不需要安装JRE。
内存被分配给共享文件,目的是为了在JVM运行时可以访问JVM中的信息。
因此,共同文件将被下载,而不是节省时间的单一类。
平行性可以分为三种不同的类型。G1垃圾收集器对传输类数据的选择包括使用OldGC或其他任何垃圾收集方法。
请注意,G1垃圾收集器和共享字符串是利用类数据共享的唯一方法。
CDS有助于提高Java SE的响应速度。你的软件运行得越快,它所消耗的内存就越少。
减少新JVM实例的环境影响
在一台机器上运行的JVM进程只能访问共享档案的一小部分。由于我们的JVM实例不重复数据,所以需要更长的时间来启动。
为了使Java Hotspot VM运行,必须以指定的方式保存类信息。与使用传统的类数据相比,这节省了RAM空间。
节省的存储空间允许许多应用程序同时在计算机上运行。
通过改变分配给进程地址空间的应用程序的数量,可以增加内存的占用。由于这一改进,模块化图像的运行时组件使用更少的RAM(在Windows内部)。
应用类数据共享
归档的应用类有利于加快运行时间,这是一个巨大的好处。此外,AppCDS通过允许众多JVM进程共享内存,最大限度地减少了它们的运行时间占用。
因此,你可以使用这个功能在网络存储设备上保存应用类。
所有的Java进程都共享类信息。这意味着,不同的Java进程可以共享相同的类信息。
AppCDS是唯一支持存档的类加载器,普通的系统类加载器不支持。因此,几个Java虚拟机(JVM)可以共享一个存档文件,这样可以节省时间和空间。
Application Class Data Sharing (ACDS)是指应用程序类的共享存档。
AppCDS提供以下类的数据共享。
- 平台的运行时图像类。
- 从图像的运行时间运行的应用程序。
- Classpath类。
- 基于模块路线的类。
由于应用类信息共享(ACIS),有可能跨应用类应用CDS。
与这种方法相关的两项活动是。
- 追踪应用程序所堆积的每一个类。
- 为每个类创建一个文件,名称为
Shared Dump。当程序仍在运行时,可以使用共享转储。
第1步:制作每一个类的清单
为了启动我们的AppClassDataSharing.java 文件,我们需要使用下面的命令下载AppCDS.jar 文件。
java -XX:UnlockCommercialFeatures-XX:UseAppCDS-XX:DumpLoadedClassList=LoadedClasses.lst -jar AppCDS.jar.
注意,我们不希望干扰JRE资源。所以,我们需要创建一个新的文件,如下图所示。

在下面的图片中,AppClassDataSharing 类被列在新创建的LoadedClasses.lst 。

第2步:创建一个名称为共享转储的文件
可以通过运行一个新的命令并选择适当的选项来创建一个共享档案文件,如下图所示。
java -XX:+UnlockCommercialFeatures -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=LoadedClasses.lst -XX:SharedArchiveFile=CustomSharedArchive.jsa -cp AppCDS.jar
在应用初始化时加载类时利用CustomSharedArchive.jsa 。
第3步:从菜单中选择共享转储文件
CustomSharedArchive.jsa 应该用指定的命令和参数执行,以利用我们的应用程序。
现在,任意的随机no-generator 持有人和AppClassDataSharing ,从共享项目文件中加载。这个组件存储了关键数据。
我们可以使用时间函数来检查- Xshare: on 和- Xshare: off 如何影响执行。然而,由于应用程序的规模不大,这些数据可能没有意义。

我们的软件现在更小了,需要更少的时间来执行。
在每个平台上更新共享存档
可以在任何支持的平台上重建共享存档,包括Linux。默认的JRE安装现在包括大量的库类。
由于一项改进,从你的框架的加载跟踪器中转储所有加载的库类,你可能会开发一个类成员的清单。
java -XX:DumpLoadedClassList=<class_list_file>
使用你从剖析数据中获取的类列表创建共享档案。可以使用以下命令找到共享JVM库和归档。
/lib/[arch]/server/classes.jsa
对于Windows。
/bin/server/classes.jsa
如果找到了相同的归档文件,JVM库就会覆盖该文件。因此,可能会通过直接覆盖当前的文件来制作另一个文件。
可以通过以管理员身份登录来创建一个新的归档文件。在一个高度网络化的环境中,使用类似于Java SE建立的计算机登录。
使用以下命令,使用提供的类重新创建存档。
java -XX:SharedClassListFile=<class_list_file> -Xshare:dump
每次创建归档时都会提供诊断数据。
手动控制类数据的共享
默认情况下,跨类的数据交换是允许的。然而,你可以手动启用和停用这个功能。
下面是一些更多的命令行参数,以帮助进行故障排除和诊断。
-
Xshare: off是默认设置。它决定了类的数据是否可以被共享。 -
Xshare: on标志着该文件可用于共享。如果你不能激活班级数据共享功能,将显示一个错误信息,并且软件将关闭。由于空间布局的随机性,这个选项只能用于测试。
总结
本教程演示了Java数据类共享功能如何在使用较少内存(JVM)的情况下加快启动速度。
我们还研究了使用Xshare: off 和Xshare: on 命令的数据类共享。