通过复制目录安装 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 存档中。
当通过 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 存档中。