Как взять дамп кучи в 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>
Он показывает вам список классов, экземпляры которых занимают больше всего места в куче. Этой информации достаточно, чтобы понять, где потеряна память.