Я хочу автоматически выполнить дамп, когда не хватает памяти, используя этот код
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
Компонент (HotSpotDiagnosticMXBean) имеет значение NULL, почему он имеет значение NULL?




Согласно javadoc для ManagementFactory.newPlatformMXBeanProxy, он вернет null, если не знает об интерфейсе MXBean с именем, заданным вторым аргументом.
Я думаю, мы можем предположить, что именно это и происходит, потому что GraalVM отличается.
Так как же получить дамп кучи для OOME на GraalVM?
Что ж, согласно документации GraalVM вы можете использовать -XX:+HeapDumpOnOutOfMemoryError и связанные с ним параметры JVM в командной строке так же, как вы можете использовать JVM Oracle/OpenJDK HotSpot. Но это только для 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());
}
}
Предостережение: я просто цитирую документацию. Я ничего из этого не пробовал.
Ну, я могу придумать решение. («Друзья не позволяют друзьям запускать Windows» :-))
Еще вы можете открыть проблему GraalVM с просьбой о поддержке -XX:+HeapDumpOnOutOfMemoryError в Windows. Или, что еще лучше, реализуйте это самостоятельно и внедрите патч... для всех остальных пользователей GraalVM в Windows.
Спасибо, я действительно прочитал статью. Перечитав еще раз, я понял, что этот аргумент graalvm (-XX:+HeapDumpOnOutOfMemoryError) работает только на Linux и Mac. с виндой не работает.