Проблемы создания кучи Java Heap [duplicate]

Многие, если не все, другие ответы здесь подходят для небольших наборов данных. Для масштабирования требуется больше внимания. См. здесь .

В нем обсуждается несколько более быстрых способов делать групповые макс и верхние N на группу.

10
задан andersoj 13 March 2011 в 03:33
поделиться

3 ответа

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

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

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


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

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

8
ответ дан Stephen C 27 August 2018 в 21:12
поделиться

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

4
ответ дан npellow 27 August 2018 в 21:12
поделиться

У меня возникла проблема с попыткой сделать это на производственной машине, создающей 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

detach quit

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

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

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

7
ответ дан Simon B 27 August 2018 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: