Остановлена ​​ли JVM при выполнении jmap? - PullRequest
12 голосов
/ 13 марта 2011

Продолжает ли мое java-приложение работать, пока jmap получает дамп памяти?

Ответы [ 3 ]

10 голосов
/ 22 мая 2016

У меня была проблема с попыткой сделать это на производственном компьютере, создание файла hprof с jmap заняло много лет и естественным образом заблокировало веб-приложение java на века.

Я нашел эту страницу:

http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/

Это объясняет, что вы также можете использовать gdb (в системах linux) для выгрузки ядра процесса Java.

С помощью этого файла ядра вы можете сгенерировать файл hprof дляанализ в отдельном процессе, который предотвращает прерывание вашего процесса на сервере Java в течение такого длительного времени.Что бы произошло, если бы вы выполнили ту же операцию с jmap.

Подводя итог:

загрузите и установите gdb

apt-get update

apt-get install gdb

...

получить идентификатор процесса java интересующего вас процесса java

jps ...

запустить сеанс GDB с этим процессом

GDB [pid] ...

, а затем создать файл ядра:

gcore /tmp/jvm.core

завершить сеанс GDB

отключить выход

затем используйте созданный файл ядра для создания файла hprof:

sudo jmap -dump: format = b, file = jvm.hprof / usr / bin / java /tmp/jvm.core

затем (g) заархивируйте файл и скопируйте его на свой компьютер для дальнейшего анализа.

10 голосов
/ 13 марта 2011

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

Является ли это "короткой" паузой или "длинной" паузой, зависит от того, сколько сброшено. Если вы используете «-dump», вы сбросите всю кучу, включая недоступные объекты. Если вы используете «-dump: live», вы будете сбрасывать только достижимые объекты ... но это также влечет за собой (по крайней мере) разметку кучи, чтобы выяснить, какие объекты достижимы.

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


В связи с предположением, что вы можете избежать остановки JVM с помощью fork, оказывается, что разветвление многопоточного процесса может быть проблематичным:

Тогда возникает проблема с использованием ресурса.

4 голосов
/ 13 марта 2011

Я бы сказал, что ваша программа на короткое время остановится, пока дамп памяти занят.Дамп памяти - это моментальный снимок вашей работающей программы, поэтому jmap потребуется на короткое время заблокировать JVM, пока эта память читается.Однако отправить файл дампа обратно клиенту можно в отдельном потоке, что минимизирует паузу.

...