Почему я не вижу корни GC?

У меня есть приложение, которое зависло с OutOfMemory. Я загрузил phd-файл после сбоя в Eclipse Memory Analyzer. Я быстро идентифицировал довольно подозрительный ArrayList с около 5 700 000 записей, каждая из которых представляет собой строку с содержанием 16 нулевых байтов (????). Примечание: я проверил не все записи, но проверил несколько меньший образец.

Неудивительно, что мне интересно, кто цепляется за такую ​​глупость, поэтому я щелкнул правой кнопкой мыши на ArrayList и открыл "Путь к корням GC" (со всеми ссылками или с некоторым исключением, похоже, это не имеет значения),

Откроется новая вкладка, в которой будет показана только одна строка ArrayList с добавленным суффиксом "Неизвестно".

Итак, мой вопрос в заголовке: почему я не вижу корни GC?

Различные версии материала участвуют.

Приложение работает на Websphere 8.x на некоторых 1.6 IBM JRE

Eclipse Memory Analyzer: версия 1.5.0

Framework Диагностического Инструмента для Java (для загрузки дампов IBM): 1.10.0.201211161052

1 ответ

Решение

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

Я создал свежий heapdump из приложения, пока он работал нормально. Конечно же, был еще один экземпляр странного ArrayList, который содержал Strings, состоящие из NULL-байтов. В нем было всего 10 записей, и он занимал только очень маленькую часть кучи.

Этот ArrayList имел два пути к "классу системы" GC-корня: один через com.ibm.ws.security.core.WSAccessManager и один через com.ibm.ws.security.util.MultiDomainHelper. Для первого я нашел ошибку, которая может быть связана с: http://www-01.ibm.com/support/docview.wss?uid=swg1PI33412

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