Почему я не вижу корни 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