Что такое "живые" объекты в куче Java? (дамп кучи с помощью jmap) - PullRequest
1 голос
/ 03 апреля 2019

jmap справка показывает:

...

-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.

...

После сбросаTomcat (с параметром java -Xmx384m) куча:

jmap -dump:file=dump.bin <pid>

Я получил файл дампа ~ 300M.

Когда я сбрасываю его кучу только с live только объектами:

jmap -dump:live,file=live-dump.bin <pid>

Я получил файл дампа ~ 120M.

Мои предположения о живых объектах могут быть:

  1. Объекты в молодом поколении;

  2. Объекты, которые используются / ссылаются / достижимы и не будут собраны.

Какой из них правильный?

ОБНОВЛЕНИЕ

Мое предположение # 2 кажется правильным, и спасибо за объяснение Алексея Рагозина (опция live вызовет полный сборщик мусора).Я снова проверил согласно его подсказке:

jmap -dump:file=dump.hprof <pid>
jmap -dump:live,file=live-dump.hprof <pid>
jmap -dump:file=after-live-dump.hprof <pid>

Размер этих 3 файлов:

dump.hprof ~190MB
live-dump.hprof ~40MB
after-live-dump.hprof ~40MB

, поэтому после -dump:live почти все объекты в куче являются живыми.

1 Ответ

2 голосов
/ 03 апреля 2019

jmap -dump:live,file=live-dump.bin <pid>

Параметр

live в приведенной ниже команде jmap вынуждает JVM выполнить полный сборщик мусора перед выгрузкой содержимого кучи в файл.

После полного GC в куче остаются только объекты, транзитивно достижимые из корней GC (определение «живой»).

...