Bantuan jmap menunjukkan:

...

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

...

Setelah saya membuang tumpukan Tomcat (dengan Java param -Xmx384m):

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

Saya mendapat file dump ~ 300 juta.

Ketika saya membuang tumpukannya dengan objek live saja:

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

Saya mendapat file dump ~ 120M.

Dugaan saya tentang objek langsung mungkin:

  1. Objek pada generasi muda;

  2. Objek yang digunakan / direferensikan / dijangkau dan tidak akan dikumpulkan.

Yang mana yang benar?

PERBARUI

Tebakan saya #2 tampaknya benar, dan terima kasih atas penjelasan Alexey Ragozin (opsi live akan menyebabkan GC penuh). Saya menguji lagi sesuai dengan petunjuknya:

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

Ukuran dari 3 file ini adalah:

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

Jadi setelah -dump:live, hampir semua objek di heap hidup.

3
auntyellow 3 April 2019, 16:30

1 menjawab

Jawaban Terbaik

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

Opsi live dalam perintah jmap di bawah ini memaksa JVM untuk melakukan GC penuh sebelum membuang konten heap ke dalam file.

Setelah GC penuh, hanya objek yang dapat dijangkau secara transitif dari akar GC (definisi "langsung") yang tersisa di heap.

7
Alexey Ragozin 3 April 2019, 17:58