JVM остановлена ​​при выполнении jmap?

работает ли мое приложение java, пока jmap принимает дамп памяти?

спасибо

Ответ 1

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

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

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


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

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

Ответ 2

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

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

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) запишите файл и скопируйте его на свой компьютер для дальнейшего анализа.

Ответ 3

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