Поиск утечки памяти Java, когда не вся используемая куча достижима из streamов

Я рассматриваю потенциальную утечку памяти (или, по крайней мере, отходы памяти) в довольно большой системе на основе Java. JVM работает с максимальным размером кучи 5 ГБ, а использование кучи на 2-3 ГБ является ожидаемой базовой линией для приложения. (Там могут быть пики, которые выше)

В сценарии перегрузки, который я изучаю, куча заполняется. Анализ кучи-дампа с помощью «Eclipse MemoryAnalyzer Tool» показывает (неудивительно), что куча полностью израсходована.

MAT показывает 2 потенциальных кандидата на утечку, которые примерно сохраняют 2,5 ГБ: java.lang.Thread и объект домена из системы, который широко используется при обработке транзакций в системе. Однако все эти объекты домена (не удивительно) доступны из экземпляров Thread. В конце концов, эти streamи обрабатывают транзакции. Таким образом, 2,5 ГБ приписывается java.lang.Thread почти полностью вызван этими объектами домена. Не удивительно.

При отображении дерева объектов всех экземпляров java.lang.Thread и суммирования сохраненной кучи всех streamов получается 2,5 ГБ сохраненной кучи.

Где я должен искать другие 2,5 ГБ, которые необходимы для заполнения кучи, если они недоступны из экземпляра java.lang.Thread? – В очереди финализатора ничего нет. В ожидании GC не существует значительного количества недостижимых объектов

Я думаю, что еще один способ поставить этот вопрос: «Как найти все объекты, недоступные из экземпляра java.lang.Thread? Возможно, OQL-запрос?» И другой вопрос: «Какие объекты существуют там, недоступны из экземпляра java.lang.Thread, а затем объекты в очереди Finalizer и объекты без ссылок в ожидании GC? ”

Я тоже столкнулся с проблемой утечек памяти на нашем сайте,
Используйте профилировщик yourkit java, который предоставляет много информации и с его возможностями вы можете иметь более широкое изображение, где используется вся память.
Вы можете найти отличный учебник « Найти утечки памяти Java» с помощью вышеуказанного инструмента.

Ваш вопрос,

«Какие объекты существуют, которые недоступны из экземпляра java.lang.Thread, а затем объекты в очереди Finalizer и объекты без ссылок в ожидании GC?»

Существует четыре вида объектов,

  1. Сильные достижимые объекты, которые могут быть достигнуты непосредственно через ссылки с живых объектов
  2. Слабые / Мягкие достижимые объекты, которые имеют слабую / мягкую ссылку, связанную с ними
  3. В ожидании завершения, объекты, которые ожидаются для завершения, и чья ссылка может быть достигнута через очередь финализатора
  4. Недостижимыми являются объекты, недоступные из корней GC, но еще не собранные

Кроме того, JVM также использует Native memory, информацию о которой вы можете найти в IBM Heap и встроенной памяти, используемой JVM и благодарностью за память, и согласно вашемуKit, структура памяти JVM имеет память Non-Heap, определение которой согласно ней

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

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

FindBugs

FindBugs – это инструмент статического анализа, который сканирует ваш код, ищущий общие анти-шаблоны и проблемы, и дает вам хороший отчет о них. Это действительно связано с множеством причин потенциальной утечки памяти и ресурсов.

Ручная свалка

Вы можете попытаться использовать что-то вроде jmap или visualvm, чтобы вручную взять кучу дампа для анализа и посмотреть, не получаете ли вы разные результаты, чтобы позволить eclipse сделать это:

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html

http://java.dzone.com/articles/java-heap-dump-are-you-task

Анализатор Quirks

Анализатор памяти FAQ:

http://wiki.eclipse.org/MemoryAnalyzer/FAQ

говорит:

Признак: при мониторинге использования памяти в интерактивном режиме используемый размер кучи намного больше, чем то, что сообщает MAT.

Во время создания индекса анализатор памяти удаляет недоступные объекты, потому что различные алгоритмы сбора мусора имеют тенденцию оставлять некоторый мусор (если объект слишком мал, перемещение и переназначение адресов является дорогостоящим). Это, однако, должно составлять не более 3 – 4 процентов. Если вы хотите узнать, какие объекты удалены, включите вывод отладки, как описано здесь: MemoryAnalyzer / FAQ # Enable_Debug_Output

Другая причина может заключаться в том, что куча кучи не была написана правильно. Особенно старые VM (1.4, 1.5) могут иметь проблемы, если дамп кучи написан через jmap.

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

Некоторые из этих советов могут быть релевантными

http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/

Используйте JProfiler и разбивайте объект кучи на число вниз по classу – найдите, в каком classе есть много экземпляров, и начните свою охоту там.

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

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

FYI: У меня нет связи с JProfiler.

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

Since the extra memory is not showing in MAT it's hard to know what to suggest. Это неправда. MAT показывают недостижимые объекты. Просто перейдите в раздел «Настройки» и установите флажок «Включить эти параметры». После перезапуска MAT вы увидите эти объекты с деталями. Конечно, корни для GC будут недоступны.