Почему я не могу установить HeapDumpOnOutOfMemoryError для собственного образа GraalVM?

Я хочу автоматически выполнить дамп, когда не хватает памяти, используя этот код

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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно 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());
     }
 }

Предостережение: я просто цитирую документацию. Я ничего из этого не пробовал.

Спасибо, я действительно прочитал статью. Перечитав еще раз, я понял, что этот аргумент graalvm (-XX:+HeapDumpOnOutOfMemoryError) работает только на Linux и Mac. с виндой не работает.

Mohammad Fatoni 06.07.2024 13:01

Ну, я могу придумать решение. («Друзья не позволяют друзьям запускать Windows» :-))

Stephen C 07.07.2024 05:41

Еще вы можете открыть проблему GraalVM с просьбой о поддержке -XX:+HeapDumpOnOutOfMemoryError в Windows. Или, что еще лучше, реализуйте это самостоятельно и внедрите патч... для всех остальных пользователей GraalVM в Windows.

Stephen C 07.07.2024 07:16

Другие вопросы по теме