通过复制目录安装 JRE 是否会影响 class 数据共享 (CDS)?

Is class data sharing (CDS) impacted by installing a JRE via copying a directory?

当通过 Oracle JRE 安装程序安装 JRE 时,安装程​​序会创建一个共享存档,以启用 class data sharing (CDS),减少 JRE 进程的启动时间和内存占用。

问题

如果我们的安装程序通过复制 JRE 目录来安装 JRE,我们会失去 class 数据共享吗?

如果是这样,是否可以通过我们自己的安装程序重新生成共享存档(使用 java -Xshare:dump)来解决这个问题?

Java 代码中是否有检测 class 数据共享是否处于活动状态的机制?

我们的安装包括一个共享存档(例如,jre/bin/client/classes.jsa),它可能是在我们使用 Oracle 安装程序安装 Java 的原始机器上创建的。这是有用的、无害的还是有害的?

详情

我们正在使用 Java7。至少在某些机器上,我们正在使用 HotSpot 客户端 VM。

相关问题

"Is the Java code saved in a Class Data Sharing archive (classes.jsa) compiled natively or is it bytecode?" - 接受的答案是本地人,但似乎有点猜测。

by copying a JRE directory, do we lose class data sharing?

Class 只有 JVM 版本和引导类路径保持不变,数据共享文件才有效。由于 JDK-8046070 从 8u40 开始,JVM 将拒绝加载 CDS 存档,即使重命名或移动 JRE 目录也是如此。

Java 7 仍然允许在复制 JRE 目录时重用 CDS 存档,但这不是一个可靠的功能,我不建议这样做。

can that be solved by regenerating the shared archive (using java -Xshare:dump)

是的,这是正确的方法。这样可以保证生成的CDS存档的完整性,也可以节省安装包的大小。

Is there a mechanism in Java code to detect whether class data sharing is active or not?

是的,通过使用 JMX 读取 UseSharedSpaces 标志:

    HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
            ManagementFactory.getPlatformMBeanServer(),
            "com.sun.management:type=HotSpotDiagnostic",
            HotSpotDiagnosticMXBean.class);
    System.out.println(bean.getVMOption("UseSharedSpaces"));

您也可以通过 -XX:+RequireSharedSpaces JVM 标志强制要求 CDS。

"Is the Java code saved in a Class Data Sharing archive (classes.jsa) compiled natively or is it bytecode?"

取决于您所说的 "compiled natively" 是什么意思。 Class 元数据以特定于具体平台的本机格式保存。但是没有编译字节码。没有提前编译,Java 字节码按原样保存在 CDS 存档中。