我想使用此代码在内存不足时自动转储
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,如果它不知道具有第二个参数给出的名称的 MXBean 接口,它将返回 null
。
我认为我们可以假设这就是这里发生的事情……因为 GraalVM 是不同的。
那么如何在 OOME 上获取堆转储?
根据 GraalVM 文档,您可以使用
-XX:+HeapDumpOnOutOfMemoryError
和相关 JVM 选项...就像 Oracle / OpenJDK HotSpot JVM 一样。 但这可能仅适用于 GraalVM Java 21 及更高版本。
或者,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());
}
}