#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, а затем посмотреть, как меняется куча между сборками мусора. Вы также можете проверять объекты, графически следовать ссылкам и получать трассировки стека из того места, где ваше приложение в данный момент выделяет объекты. Вот краткое введение.
Этот инструмент можно бесплатно использовать для разработки, и вы можете скачать его здесь.