Утечка памяти Java - PullRequest
       18

Утечка памяти Java

4 голосов
/ 28 октября 2009

Кто-нибудь использовал менеджер памяти Eclipse для обнаружения утечки памяти в кодах Java? Кто-нибудь может порекомендовать хорошее место для поиска информации об использовании диспетчера памяти? Я читаю что-то онлайн, это говорит о том, что мне нужно позволить программе работать до тех пор, пока она не выйдет из строя (возникает ошибка нехватки памяти), что сгенерирует отчет о сбое. Затем используйте диспетчер памяти, чтобы открыть этот отчет, чтобы проверить, где может произойти утечка памяти. Так все используют диспетчер памяти?

Ответы [ 6 ]

2 голосов
/ 28 октября 2009

Хотя -XX: + HeapDumpOnOutOfMemoryError может быть полезным, мой текущий рабочий процесс использования Eclipse Memory Manager:

  1. Запустите программу нормально
  2. Подождите, пока память выйдет из-под контроля.
  3. Выполнить jmap : jmap -dump:format=b,file=dump.hprof <PID>
  4. Откройте файл hprof в EMM.

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

VisualVM может быть полезен, но кажется гораздо менее эффективным, чем EMM, при работе с дампом кучи (EMM кеширует много информации о загрузке дампа кучи). Netbeans Profiler удобен для получения местоположений распределения и для профилирования времени.

2 голосов
/ 28 октября 2009

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

Я не думаю, что это правда - вы не получите файл дампа, когда OutOfMemoryError произойдет (я бы поспорил, что автор путает эту проблему с какой-то ошибкой JVM, которая может привести к тому, что дамп ядра будет Сохраненный).

Лучшая процедура - создать дамп кучи, используя jmap ; это выведет содержимое кучи в двоичный файл (обычно известный как файл hprof). Этот файл может быть проанализирован любым количеством анализаторов:

  • jhat - Инструмент Sun, который анализирует файл hprof, запускает встроенный веб-сервер, чтобы вы могли анализировать кучу через веб-браузер / просматривать отчеты. Я обнаружил, что это очень медленно для больших куч.
  • VisualVM - Удивительный инструмент отладки / устранения неполадок в комплекте с JDK. Среди прочего, это также может быть использовано для создания дамп кучи любого работающего процесса, а также дамп потока. Я обнаружил, что загружать большие файлы hprof очень медленно.
  • Eclipse Memory Analyzer - Плагин Eclipse, который может генерировать файлы hprof.

Я бы настоятельно рекомендовал использовать плагин Eclipse, поскольку он очень быстро загружает большие (> 500 МБ) дампы кучи (менее чем за минуту), создает полезные отчеты, поддерживает язык запросов со сложной логикой и т. Д.

2 голосов
/ 28 октября 2009

Пожалуй, самое простое - это запустить программу под HProf (входит в стандартную комплектацию JVM) на некоторое время и принудительно завершить работу. Надеемся, что вывод HProf даст вам несколько подсказок. ваша утечка памяти.

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

1 голос
/ 28 октября 2009

Эта страница объясняет работу с дампами кучи jvm. Jhat - более простой, хотя и менее графический способ работы с кучами, но вы также можете загрузить те же файлы дампа в менеджер памяти eclipse. Вы также можете получить некоторую информацию от jvisualvm, если вы используете текущую (1.6) jvm.

0 голосов
/ 28 октября 2009

Вы можете попробовать использовать Jprobe . Вы можете следить за своим приложением и просматривать объекты по мере их создания. Также это поможет проанализировать, какие объекты не будут собирать мусор, и будут ли указатели двигаться дальше.

Хотя оно не бесплатное, но я помню, оно поставляется с пробной лицензией, поэтому проверьте это.

0 голосов
/ 28 октября 2009

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

...