2009-09-24 2 views
6

У меня есть отдельная программа, которую я запускаю локально, она предназначена для того, чтобы быть программой типа сервера, работающей круглосуточно и без выходных. Недавно я обнаружил, что у него есть утечка памяти, прямо сейчас единственным нашим решением является перезапуск его каждые 4 часа. Каков наилучший способ найти утечку памяти? Какой инструмент и метод мы должны использовать?Общая стратегия для устранения утечки памяти Java?

ответ

12

Если вы используете Java от Sun и используете хотя бы обновление по Java 6 (то есть самое новое), попробуйте запустить jvisualvm из JDK на том же компьютере, что и ваша программа, и присоедините к нему и включите профилирование ,

Это, скорее всего, самый простой способ начать работу.

+0

В прошлый раз, когда я проверил, самое новое обновление было 16 ... :-) Не уверен, что VisualVM был представлен. Это так недавно? – PhiLho

+0

JVisualVM был добавлен в JDK в 1.6.0_07, я считаю. –

+1

Запустите VisualVM. Выберите текущий процесс из списка. Щелкните правой кнопкой мыши и выберите кучу дампа. Пусть это бежит немного. Захватите другую кучу кучи. Затем используйте «Файл»> «Сравнить снимки памяти», чтобы узнать, что изменилось. –

1

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

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

Посмотрите на инструменты, такие как jmap и jhat.

2

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

7

Когда речь заходит о проблемах с памятью охоты, я использую инструмент анализа кучи дампы SAP Memory Analyzer Eclipse Memory Analyser (MAT).

Анализатор памяти представляет собой инструментарий общего назначения для анализа дампов кучи Java. Помимо кучного хождения и быстрого вычисления сохраненных размеров, инструмент Eclipse сообщает о подозрениях на утечку и потреблении памяти. Основной областью применения являются ошибки из памяти и высокое потребление памяти.

Инициировано SAP, проект с тех пор был открыт и теперь известен как Eclipse Memory Analyser. Проверьте Getting Started страницу и особенно раздел Finding Memory Leaks (я наклеивая его ниже, потому что я установил некоторые ссылки):

Start, запустив leak report для автоматической проверки на наличие утечек памяти.

Этот блог подробно How to Find a Leaking Workbench Window.

Анализатор памяти вырос в SAP. В то время, Krum blogged about Finding Memory Leaks with SAP Memory Analyzer. Содержание по-прежнему актуально!

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

PS: Я не работаю для SAP/IBM/Eclipse, я просто очень счастливый пользователь MAT с положительной обратной связью.

1

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

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

и

jhat heap.dump.out 

< где PID > легко найти из jvisualvm. Затем в браузере перейдите на localhost: 7000 и начните изучение.

Смежные вопросы