Получить дамп кучи из JRE только в Windows

Наш продукт работает на серверах наших клиентов только с JRE(без JDK) в Windows.

Я знаю, что я могу получить дамп кучи на OutOfMemoryError через флаг.

Однако есть ли способ получить дамп кучи из процесса JRE JVM с упреждением?

Я планировал получить несколько здоровых дампов кучи и сравнить их с дампом кучи, полученным в OutOfMemoryError.

Желательно, чтобы я мог попросить клиента загрузить этот инструмент / утилиту, а затем запустить его на сервере, чтобы получить дамп кучи по желанию.

Я пробовал jvisualvm, однако jvisualvm не перечисляет наш продукт jVM. В нем будут перечислены только некоторые JVM, работающие в то время, и не все JVM, работающие в то время. ПЛЮС jvisualvm очень громоздкий.

PS: Существуют ли сторонние утилиты, которые можно запустить на хосте JVM для выгрузки кучи? Кроме того, клиент не может обновить JRE в данный момент. И ни один из ответов на предыдущий вопрос не выбран в качестве ответа!

Спасибо,

1 ответ

Решение
  1. Чтобы выгрузить кучу изнутри JVM, используйте com.sun.management.HotSpotDiagnosticMXBean:

        HotSpotDiagnosticMXBean hs =
                ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
        hs.dumpHeap("/path/to/heapdump.bin", false);
    
  2. Чтобы выгрузить кучу другого процесса извне, используйте механизм динамического присоединения HotSpot.
    Я написал крошечную утилиту для этого, смотрите https://github.com/apangin/jattach.

    Создайте программу с make а потом беги

    jattach <PID> dumpheap /path/to/heapdump.bin
    
Другие вопросы по тегам