当通过Oracle JRE安装程序安装JRE时,安装程序会创建一个共享的存档,该存档可以启用类数据共享(CDS),减少JRE Process的启动时间和内存足迹。
问题
如果我们的安装程序通过复制JRE目录来安装JRE,我们是否会丢失类数据共享?
如果是这样,可以通过从我们自己的安装程序中再生共享存档(使用java -Xshare:dump
)来解决吗?
Java代码中是否有一个机制来检测类数据共享是否处于活动状态?
我们的安装包括共享存档(例如JRE/bin/client/class.jsa),该档案可能是在我们使用Oracle Installer安装的原始计算机上创建的。这是有用的,无害的还是有害的?
详细信息
我们使用的是Java 7.至少在某些机器上,我们正在使用Hotspot客户端VM。
相关问题
" Java代码是否保存在本机本地编译的类数据共享存档(类)中? - 接受的答案说本机,但似乎有些猜测。
通过复制JRE目录,我们是否会丢失类数据共享?
类数据共享文件仅在JVM版本和引导类Path的情况下才有效。从JDK-8046070 JVM开始,从8U40开始,即使JRE目录被重命名或移动,也将拒绝加载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标志强制CD要求。
" Java代码是否保存在本机内编译的类数据共享存档(class.jsa)中?"
取决于"本地编译"的含义。类元数据以特定于混凝土平台的本机格式保存。但是没有编译字节码。没有提前编译,Java字节码保存在CDS档案中。