Создание "дампа памяти" java-приложения?

У меня есть приложение Java, которое, к сожалению, через некоторое время начинает потреблять довольно большие объемы памяти. Чтобы усложнить ситуацию, это не только приложение Java, но и приложение JavaFX 2.

Я подозреваю, что существует некоторая утечка памяти, возможно, даже в базовых вызовах JavaFX и нальных lib.

Идеальным решением было бы получить дамп всех java-объектов в какой-то момент (с использованием их памяти), а затем проанализировать этот дамп. Есть ли способ достичь этого?

Ответ 1

Существует множество способов получить кучу кучи, начиная с простых инструментов, таких как jmap, до более причудливых вещей, таких как JVisualVM или даже коммерческих инструментов, таких как JProfiler. Правильное толкование этих дампов может быть сложным, поэтому вы можете опубликовать именно то, что ищете. Собираетесь ли вы искать утечку памяти или хотите узнать общее мнение о своем приложении?

Ответ 2

Используйте jmap -heap:format=b <process-id> для создания двоичного дампа кучи, который затем может быть загружен в несколько инструментов - мой любимый объект - это "Анализатор памяти Eclipse"

Ответ 3

Вы можете использовать jvisualvm. У этого есть плагин, чтобы видеть живую память и получать свалку из нее.

Ответ 4

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

su $JVM_OWNER -c "gcore -o /tmp/jvm.core $YOUR_JVM_PID"
su $JVM_OWNER -c "jmap -dump:format=b,file=jvm.hprof /usr/bin/java /tmp/jvm.core"

Требуется установка gdb (для gcore) и установка JDK (для jmap). Также обратите внимание, что вам может потребоваться настроить /usr/bin/java на путь JVM, используемый для процесса.