Как определить владельца ссылки на объект в Java Memory Analyzer с помощью дампа кучи
Поскольку у меня есть некоторые проблемы с OutOfMemoryErrors с приложением, я хочу определить основную причину. Для этого я создал дамп кучи (PHD) из виртуальной машины IBM на сервере AIX и попытался проанализировать его с помощью IBM Support assistant 4.1 и его инструмента Memory Analyzer.
Когда анализируется дамп кучи, ISA спрашивает меня, хочу ли я запустить отчет о подозрении на утечку.
Используя поддержку защиты от утечек, я получил информацию о некоторых классах, которые занимают значительное количество памяти.
Теперь я хочу идентифицировать владельца ссылок на объекты, но я могу, например, видеть только те объекты, которые содержит ArrayList, но не кто содержит ссылку на этот ArrayList.
Как я могу получить эту информацию?
1 ответ
Загрузите свой дамп кучи в анализаторе памяти (MAT).
Перейдите к гистограмме и увидите объект большого размера.
Теперь щелкните по нему правой кнопкой мыши и выберите "Немедленные доминаторы". Это откроет дерево доминант, и вы сможете определить, что удерживает ваш объект.
Иногда, когда объект большого размера является локальной переменной, вы не сможете увидеть непосредственные доминанты в дереве. Он может только сказать вам, что ваша переменная является частью какого-либо потока.(На следующем рисунке не показан сценарий локальной переменной)
В этом случае проверьте (трассировка стека), где вы получаете OutOfMemoryError. Затем проследите его назад и попытайтесь выяснить, в каком методе вы создаете объекты большого размера в качестве локальных переменных. В большинстве случаев мы получаем объекты большого размера в том же методе, который отображается в трассировке стека, как в какой-то момент времени, выделяя больше памяти, мы получаем OutOfMemoryError.