Размер heapdump против размера hprof

Недавно я сделал heapdump в формате hprof, когда мой сервер jboss работал с xms 4096m и xmx 4096m и размером permsize 512m.

Сгенерированный файл hprof составляет более 5 ГБ. Когда я загружаю heapdump в visualvm, mat analyzer или yourkit, я вижу только общие байты размером около 1 ГБ. Я попытался изменить область достижимости в yourkit, но он не показывает более 1 ГБ.

Любая идея, что может вызвать это большое различие в размере файла против отображаемого размера heapdump?

PS: я использую jdk1.6.0_23

К сожалению, я не могу отправлять скриншоты здесь.

В файловой системе размер hprof составляет 5,227,659 кбайт, а в yourkit он гласит:

Объекты: 9.738.282 / мелкий размер 740 мб / оставшийся размер: 740 мб Строка, достижимая среди них: 6.652.515 (68%) / мелкий размер: 381 мб (51%) / оставшийся размер: 381 Мб (51%)

Самый большой оставшийся размер - это байт [], равный 206,810,176.

3 ответа

Какую команду вы использовали для создания дампа кучи?

$JAVA_HOME/bin/jmap -dump:live,format=b,file=c:/tmp/heap_dump.bin PID

может быть, вам нужно передать живой вариант, согласно спецификации

 -dump:<dump-options> to dump java heap in hprof binary format
                   dump-options:
                     live         dump only live objects; if not specified,
                                  all objects in the heap are dumped.

Вы пробовали "Гистограмму недоступных объектов" (вы можете найти ссылку в верхней части страницы "Обзор")? В одном из моих heapdumps размером 1509MB, mat показывает только 454MB, но остальное по сути мусор, и, конечно же, сумма "Shallow Heap" в гистограмме недоступных объектов составляет 966MB.

Это просто означает, что, скорее всего, ваш дамп кучи состоял из большого количества недоступных объектов, которые могли бы быть собраны мусором, если бы GC запускался. Теперь это не означает, что у вас все еще нет утечки, это просто означает, что в вашем 5 ГБ Hprof 4 ГБ объектов были недоступны и, следовательно, не были интересными источниками утечки.

В Java утечка памяти может произойти только в том случае, если сборщик мусора не может очистить объект, потому что что-то содержит ссылку на него (неожиданно). Таким образом, ваша утечка (если таковая имеется) должна быть найдена в 1 ГБ объектов, которые остались в вашем hprof.

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