Получить дамп кучи из JRE только в Windows
Наш продукт работает на серверах наших клиентов только с JRE(без JDK) в Windows.
Я знаю, что я могу получить дамп кучи на OutOfMemoryError через флаг.
Однако есть ли способ получить дамп кучи из процесса JRE JVM с упреждением?
Я планировал получить несколько здоровых дампов кучи и сравнить их с дампом кучи, полученным в OutOfMemoryError.
Желательно, чтобы я мог попросить клиента загрузить этот инструмент / утилиту, а затем запустить его на сервере, чтобы получить дамп кучи по желанию.
Я пробовал jvisualvm, однако jvisualvm не перечисляет наш продукт jVM. В нем будут перечислены только некоторые JVM, работающие в то время, и не все JVM, работающие в то время. ПЛЮС jvisualvm очень громоздкий.
PS: Существуют ли сторонние утилиты, которые можно запустить на хосте JVM для выгрузки кучи? Кроме того, клиент не может обновить JRE в данный момент. И ни один из ответов на предыдущий вопрос не выбран в качестве ответа!
Спасибо,
1 ответ
Чтобы выгрузить кучу изнутри JVM, используйте
com.sun.management.HotSpotDiagnosticMXBean
:HotSpotDiagnosticMXBean hs = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); hs.dumpHeap("/path/to/heapdump.bin", false);
Чтобы выгрузить кучу другого процесса извне, используйте механизм динамического присоединения HotSpot.
Я написал крошечную утилиту для этого, смотрите https://github.com/apangin/jattach.Создайте программу с
make
а потом бегиjattach <PID> dumpheap /path/to/heapdump.bin