为什么我无法在本机映像 graalvm 上设置 HeapDumpOnOutOfMemoryError?

问题描述 投票:0回答:1

我想使用此代码在内存不足时自动转储

            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?

java spring jvm graalvm graalvm-native-image
1个回答
0
投票

根据

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());
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.