📜  Java 10 中的类数据共享

📅  最后修改于: 2022-05-13 01:54:24.382000             🧑  作者: Mango

Java 10 中的类数据共享

在这里,我们将讨论作为 Java10 疾病引入的功能之一。本文介绍了有助于减少Java应用程序的启动时间和内存占用的类数据共享功能。

类数据共享 (CDS) 功能有助于减少多个Java虚拟机 (JVM) 之间的启动时间和内存占用,这在此处是一大进步。当您使用安装程序安装 Oracle Java运行时环境 (JRE) 时,安装程序会将系统Java存档 (JAR) 文件中的一组默认类加载到私有内部表示中,并将该表示转储到称为共享存档的文件中。如果未使用 JRE 安装程序,则您可以手动生成共享存档。当 JVM 启动时,共享存档是内存映射的,以允许在多个 JVM 进程之间共享这些类的只读 JVM 元数据。由于访问共享存档比加载类更快,因此减少了启动时间。

G1、串行、并行和并行OldGC 垃圾收集器支持类数据。共享字符串功能(类数据共享的一部分)仅支持 64 位非 Windows 平台上的 G1 垃圾收集器。在Java SE 中包含 CDS 的主要动机是减少启动时间。应用程序相对于它使用的核心类的数量越小,节省的启动时间部分就越大。



为什么共享存档文件(classes.jsa)很重要?

此文件很重要,因为它包含许多 System 类的转换形式的转储。由于这些Java类是每次 JVM 启动时加载的一些 System 类,它们的内容不会改变,与您自己的应用程序代码不同。这些类的转储在您安装 JRE 时进行一次并转换为易于加载的形式,并一次又一次地使用以提高 JVM 启动时间,绕过许多通常在启动 JVM 时会一次又一次发生的类加载步骤。

自己创建共享存档文件:假设 classes.jsa 文件不存在,您可以使用命令Java -Xshare:dump自己创建它。此命令将转到 classlist 文件并检查要加载哪些类并创建它的转储。可以尝试删除 jre/bin/[client or server]/classes.jsa 文件并使用命令 java_Xshare:dump 重新创建它。

在下面的快照中 classes.jsa 文件已被删除,接下来,我们使用java-Xshare:dump重新创建它

如果我们删除 JRE/lib/classlist 文件,这个过程会报错,因为它不知道要加载和转储哪些类。在下面的快照中,我们更改了 classlist 文件的名称并尝试进行了抛出错误的转储



如何检查类是否从共享存档文件或 jar 文件加载?

我们将运行一个简单的程序来查看从classes.jsa文件而不是从它们各自的 jars 加载的,我将提供给我的程序的 VM 参数将是:-详细 – Xshare:on (-Xshare: on 表示打开类数据共享)。我创建了下面的简单程序并使用上面的参数运行它。

您可以看到许多系统类从共享对象文件中加载。我还在代码中添加了简单的Math.random()以显示一个类Java.lang.Math$RandomNumberGeneralHolder,它不是从共享对象文件加载的,因为它不是共享存档的一部分,而是从 rt.jar 加载的。

如果我们使用 args -verbose – Xshare:off ,这意味着类数据共享的切换,那么得到的结果如下:

什么是“应用程序”类数据共享?

在上面的例子中,我们看到一些像 Math$RandomNumberGeneratorHolder 这样的类是从实际源和我们自己的独立类 AppClassDataSharing 加载的。 Java也是从实际源加载的。如果我们也可以将它们转储到共享存档中并在将来使用该共享存档,这将改善我们应用程序的运行时会怎样。这就是应用程序类数据共享的原因,我们也可以从应用程序类中使用 CDS。

程序:这包括 3 个步骤:



  1. 在第一个文件中记录您在使用应用程序时加载的所有类。
  2. 为这些类创建一个共享转储文件。
  3. 稍后在启动应用程序时使用该共享转储。

第 1 步:记录所有课程

上面的类名为 ' AppClassDataSharing. Java ' 在可运行的 jar AppCDS.jar 中。(因为 AppCDS 不转储平面类)。因此,要创建一个最后一个文件,我将使用以下命令如下:

java -XX:+UnlockCommercialFeatures-XX:+UseAppCDS -XX:DumpLoadedClassList=LoadedClasses.1st -jar AppCDS.jar

该文件是在自定义目录中创建的,因此在这里我们不会干扰 JRE 文件。

我们可以在上面的快照中看到一个新创建的文件 LoadedClasses.第一,我们还可以看到在下面的快照它也有其自己的类EN TRY“AppClassDataSharing。”

步骤 2:为上述类创建共享转储文件

使用第一个文件,我们将在同一位置创建转储,下面是创建自定义共享存档文件的命令和参数:



步骤 3:在启动应用程序时使用共享转储。

我们将使用以下命令和参数启动我们的应用程序以使用 CustomSharedArchive.jsa 文件'

我们可以使用time 命令(只是在命令前面加上时间前缀)来查看使用 _Xshare:on 与 -Xshare:off 时的区别。

因此,通过应用程序类数据共享,我们可以减少应用程序的占用空间和运行时间。