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

#java #out-of-memory

Вопрос:

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

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

Ответ №1:

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

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

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

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

 jmap -histo <pid>
 

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

Комментарии:

1. Визуальная виртуальная машина и профилировщик Netbeans позволяют вам делать то же самое, что и EMA.

2. Я не знаю о netbeans, но я, конечно, не нашел «кратчайшего пути к корню gc» в visual vm.

Ответ №2:

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

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

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

Ответ №3:

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

Комментарии:

1. Немного поиграв с различными инструментами, я обнаружил, что в IntelliJ также есть плагин для VisualVM (упомянутый в другом ответе). Эта комбинация в конечном итоге сработала для меня лучше всего.

Ответ №4:

Используйте анализатор памяти Eclipse

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

Ответ №5:

Используйте профилировщик, такой как JProfiler или YourKitProfiler

Ответ №6:

JProfiler работал для меня очень хорошо….

http://www.ej-technologies.com/products/jprofiler/overview.html

Ответ №7:

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

Ответ №8:

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

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