Как определить владельца ссылки на объект в Java Memory Analyzer с помощью дампа кучи

Поскольку у меня есть некоторые проблемы с OutOfMemoryErrors с приложением, я хочу определить основную причину. Для этого я создал дамп кучи (PHD) из виртуальной машины IBM на сервере AIX и попытался проанализировать его с помощью IBM Support assistant 4.1 и его инструмента Memory Analyzer.

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

Используя поддержку защиты от утечек, я получил информацию о некоторых классах, которые занимают значительное количество памяти.

Теперь я хочу идентифицировать владельца ссылок на объекты, но я могу, например, видеть только те объекты, которые содержит ArrayList, но не кто содержит ссылку на этот ArrayList.

Как я могу получить эту информацию?

1 ответ

Решение

Загрузите свой дамп кучи в анализаторе памяти (MAT).

Перейдите к гистограмме и увидите объект большого размера.

Теперь щелкните по нему правой кнопкой мыши и выберите "Немедленные доминаторы". Это откроет дерево доминант, и вы сможете определить, что удерживает ваш объект.

Иногда, когда объект большого размера является локальной переменной, вы не сможете увидеть непосредственные доминанты в дереве. Он может только сказать вам, что ваша переменная является частью какого-либо потока.(На следующем рисунке не показан сценарий локальной переменной)

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

Подробнее

Другие вопросы по тегам