我想使用此代码在内存不足时自动转储
HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(
ManagementFactory.getPlatformMBeanServer(),
"com.sun.management:type=HotSpotDiagnostic",
HotSpotDiagnosticMXBean.class);
bean.setVMOption("HeapDumpOnOutOfMemoryError", "true");
bean.setVMOption("HeapDumpPath", fileName);
如果我使用
编译它mvn clean package
它可以工作,但是如果我使用
编译它mvn clean -Pnative native:compile
bean(HotSpotDiagnosticMXBean)为null,为什么为null?
根据
ManagementFactory.newPlatformMXBeanProxy
的 javadoc,如果它不知道具有第二个参数给出的名称的 null
接口,它将返回 MXBean
。
我认为我们可以假设这就是这里发生的事情……因为 GraalVM 是不同的。
那么如何在 GraalVM 上获取 OOME 的堆转储?
根据 GraalVM 文档,您可以在命令行上使用
-XX:+HeapDumpOnOutOfMemoryError
和相关 JVM 选项...就像使用 Oracle / OpenJDK HotSpot JVM 一样。 但这仅适用于 GraalVM Java 21 及更高版本;请参阅https://github.com/oracle/graal/issues/4641。
或者,GraalVM 文档 还解释了应用程序如何以编程方式生成堆转储。 这是文档提供的示例代码的要点:
private static void createHeapDump() {
try {
File file = File.createTempFile("SVMHeapDumpAPI-", ".hprof");
VMRuntime.dumpHeap(file.getAbsolutePath(), false);
System.out.println(" Heap dump created " +
file.getAbsolutePath() +
", size: " + file.length());
} catch (UnsupportedOperationException unsupported) {
System.err.println("Heap dump creation failed: " +
unsupported.getMessage());
} catch (IOException ioe) {
System.err.println("IO went wrong: " + ioe.getMessage());
}
}
警告:我只是引用文档。 我还没有尝试过这些。