当通过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?" - 接受的回答是原生的,但似乎有些猜测。
答案 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存档中。