Как взять дамп кучи в windows с минимальным временем простоя?

Я хочу выяснить, почему использование кучи JVM на узле Elasticsearch постоянно превышает 80%. Для этого я беру дамп кучи, запустив

jmap.exe -heap:format=b 5348

(5348 - это идентификатор процесса). Затем я могу проанализировать дамп с помощью VisualVM.

Проблема в том, что jmap приостанавливает JVM при получении дампа, поэтому узел в основном находится в автономном режиме в течение примерно 5 минут.

В этой статье предлагается более быстрый подход, основанный на использовании coredump с gdb в линуксе Я уже пробовал WinDbg, который создал дамп ядра, но я не мог использовать его в VisualVM.

Есть ли подобный подход для Windows? Как можно получить кучу свалок за считанные секунды, а не минуты?

1 ответ

Решение

После того, как вы взяли coredump WinDbg, вам нужно извлечь из него дамп кучи, запустив

jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp

Это может быть сделано в автономном режиме; взаимодействие с запущенным процессом Java не требуется. Тогда вы сможете открыть сгенерированный heap.bin в VisualVM.


В качестве альтернативы вы можете взять гистограмму класса. Он создается намного быстрее, чем полный дамп кучи.

jmap -histo <PID>

Он показывает вам список классов, экземпляры которых занимают больше всего места в куче. Этой информации достаточно, чтобы понять, где потеряна память.

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