работает ли мое приложение java, пока jmap принимает дамп памяти?
спасибо
работает ли мое приложение java, пока jmap принимает дамп памяти?
спасибо
Ваше приложение остановлено. Единственный практический способ получить точный кусок кучи - это остановить всю активность приложения во время создания дампа.
Будет ли это "кратковременная" пауза или "длинная" пауза зависит от того, сколько выгружено. Если вы используете "-dump", вы сбросите всю кучу, включая недостижимые объекты. Если вы используете "-dump: live", вы удаляете только достижимые объекты... но это также влечет за собой (по крайней мере) разметку кучи, чтобы выяснить, какие объекты достижимы.
Но если вы сбрасываете кучу гигабайтного размера, ожидайте, что время паузы будет измеряться в секундах, а не в миллисекундах.
Подумайте о том, что вы можете избежать остановки JVM с помощью вилки, оказывается, что разветвление многопоточного процесса может быть проблематичным:
Тогда есть проблема с использованием ресурсов.
У меня возникла проблема с попыткой сделать это на производственной машине, создающей 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) запишите файл и скопируйте его на свой компьютер для дальнейшего анализа.
Я бы сказал, что ваша программа временно остановится, пока выйдет дамп памяти. Дамп памяти - это моментальный снимок во время запуска вашей программы, поэтому jmap необходимо будет блокировать JVM вкратце, пока эта память будет считана. Однако отправить файл дампа обратно клиенту можно в отдельном потоке, тем самым минимизируя паузу.