为什么我无法在 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,如果它不知道具有第二个参数给出的名称的
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());
     }
 }

警告:我只是引用文档。 我还没有尝试过这些。

© www.soinside.com 2019 - 2024. All rights reserved.