Как понять этот сеанс профиля памяти NetBeans в Java (видимая утечка памяти)? - PullRequest
1 голос
/ 13 августа 2011

Я новичок в Java, и мне интересно, как анализировать эту сессию профиля памяти в NetBeans и как следить за ней, чтобы получить помощь в поиске утечки памяти?

Что означает «Живые байты»? Я вижу, что при суммировании всех живых байтов я получу лишь небольшую часть используемой системной памяти Java-приложения. Почему нет информации о выделенных байтах каждого типа объекта? Является ли постоянно растущее значение «Выделенных объектов» признаком утечки памяти?

Это приложение с множеством параллельных потоков и http-соединений. Я проверил темы, и они работают нормально - я имею в виду, что не более 20 потоков одновременно. Я использовал JBOSS Netty для http-соединения и jSoup для парсинга HTML.

netbeans profiler

Эта утечка памяти вызвана слишком большим количеством выделенных объектов ParseError? или я должен искать по причине утечки памяти с трассировкой стека создания байтов?

Дополнительные ресурсы:

netbeans profiler

netbeans profiler

EDIT:

Я добавил в свой проект HTML Cleaner. Это потому, что я больше не вижу ошибок парсера. Рост утечки памяти сейчас примерно в 3-4 раза медленнее. После использования 800 МБ памяти приложение перестало работать, и я мог наблюдать за кучей в NetBeans. Результаты:

heap

Примечание. Я не создал ни одного LinkedHashMap в своем приложении, поэтому он должен быть создан другой библиотекой. TagNode - это объект, который содержит очищенный HTML после очистки HTML Cleaner. В моем приложении только один объект TagNode, и это локальная переменная в обработчике ответов http netty (вызывается messageReceived).

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

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

Самый простой способ - заставить jvm выплюнуть heapdump на OOM, передать его в MAT и на основе трассировки списка подозрительных утечек вернуться к вероятной причинеутечка памяти.

-XX:+HeapDumpOnOutOfMemoryError

- это опция JVM, которая вам понадобится.Другой подход состоит в том, чтобы генерировать некоторые heapdumps через регулярные интервалы перед OOM приложений и сравнивать их в MAT - у него есть возможность сравнивать дампы.См. здесь , чтобы узнать, как создавать дампы.Иногда необходимо проверить содержимое элементов кучи, чтобы выяснить, откуда они берутся.

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

0 голосов
/ 13 августа 2011

Кажется, у вас много объектов типа char []. Я обнаружил, что большая часть утечек памяти происходит из-за неправильно сконструированных циклов, где они повторяются больше раз, чем должны быть. Который создает огромное количество объектов, что приводит к утечке памяти.

Живые байты - это просто общее количество байтов, которые занимают живые объекты.

Используется много char[] живых байтов. Я бы с подозрением отнесся к этому, так как, вероятно, происходит утечка памяти.

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

Хорошее место для чтения: Введение в профилирование приложений Java в IDE NetBeans. Должно быть в состоянии помочь вам с отладкой в ​​NetBeans.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...