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

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

jmap.exe -heap:format=b 5348

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

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

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

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


person svetli-n    schedule 04.03.2016    source источник
comment
Я бы удостоверился, а) вы используете двоичный режим б) ваша куча как можно меньше, чтобы начать, например. свести к минимуму размер кучи и запустить полный сборщик мусора перед созданием дампа.   -  person Peter Lawrey    schedule 04.03.2016
comment
Привет Питер. Я использую двоичный режим, см. мой отредактированный вопрос и извините за путаницу. Я не могу иметь меньшую кучу, так как это производственная машина, работающая с большим количеством данных.   -  person svetli-n    schedule 04.03.2016
comment
Получение дампа кучи не будет дешевым, поскольку для получения всех данных в виде согласованного моментального снимка придется остановить JVM.   -  person Peter Lawrey    schedule 04.03.2016
comment
@apangin - это может быть ясно сейчас, но не тогда, когда оно было помечено как спам/оскорбительное.   -  person ChrisF    schedule 05.03.2016


Ответы (1)


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

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

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


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

jmap -histo <PID>

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

person apangin    schedule 06.03.2016