Как я могу увидеть, что находится в моей куче в Java?

Мне удалось получить "утечку" памяти в Java-приложении, которое я разрабатываю. При запуске моего набора тестов JUnit я случайно получаю исключения из памяти (java.lang.OutOfMemoryError).

Какие инструменты я могу использовать для проверки кучи моего приложения java, чтобы узнать, как использовать всю мою кучу, чтобы я мог решить, какие ссылки на объекты, которые должны быть собраны для мусора.

Ответы

Ответ 1

VisualVM включен в самые последние версии Java. Вы можете использовать это для создания дампа кучи и посмотреть на объекты в нем.

В качестве альтернативы вы также можете создать команду heapdump с помощью jmap (в вашем каталоге jdk/bin):

jmap -dump:format=b,file=heap.bin <pid>

Вы даже можете использовать это, чтобы получить быструю гистограмму всех объектов

jmap -histo <pid>

Я могу порекомендовать Eclipse Memory Analyzer (http://eclipse.org/mat) для расширенного анализа дампов кучи. Это позволяет точно узнать, почему объект или набор объектов жив. Здесь запись в блоге, показывающая, что может сделать Memory Analyzer: http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

Ответ 2

Если вам нужно что-то бесплатно, попробуйте VisualVM

Из описания проекта:

VisualVM - это визуальный инструмент, интегрирующий инструменты JDK в командной строке и облегченные возможности профилирования. Предназначен для использования как для разработки, так и для производства.

Ответ 3

Это довольно старый вопрос. Многие люди, возможно, начали использовать IntelliJ, поскольку он был первоначально дан. IntelliJ имеет плагин, который может отображать использование памяти под названием JVM Debugger Memory View.

Ответ 6

Используйте Eclipse Memory Analyzer

Нет никакого другого инструмента, который бы знал о любом инструменте, который близок к его функциональности, производительности и цене (свободный и открытый исходный код) при анализе дампов кучи.

Ответ 7

Если вы используете систему, поддерживающую GTK, вы можете попробовать использовать JMP.

Ответ 8

Вы можете попробовать детектор утечки памяти, который является частью набора инструментов JRockit Mission Control. Это позволяет вам проверять кучу во время работы JVM. Вам не нужно делать снимки все время. Вы можете просто подключиться к Интернету в JVM, а затем посмотреть, как изменяется куча между сборками мусора. Вы также можете проверять объекты, следовать графическим ссылкам и получать трассировки стека, где ваше приложение в настоящее время распределяет объекты. Вот краткое описание .

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