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

时间:2015-05-05 22:04:13

标签: java jvm installer

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

问题

如果我们的安装程序通过复制JRE目录来安装JRE,那么我们是否会丢失类数据共享?

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

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

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

详细信息

我们正在使用Java 7.至少在某些机器上,我们使用的是HotSpot客户端虚拟机。

相关问题

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

1 个答案:

答案 0 :(得分:2)

  

通过复制JRE目录,我们是否会丢失类数据共享?

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

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

  

可以通过重新生成共享存档(使用java -Xshare:dump)

来解决

是的,这是一种正确的方法。这将确保生成的CDS存档的完整性,并节省安装包的大小。

  

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

是的,通过使用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。

  

“Java代码是保存在本地编译的类数据共享存档(classes.jsa)中还是字节码?”

取决于“本地编译”的含义。类元数据以特定于具体平台的本机格式保存。但是没有编译字节码。没有提前编译,Java字节码按原样保存在CDS存档中。

相关问题