Как дамп динамической кучи jmap может содержать недоступные объекты?

Я использовал jmap для дампа живой кучи приложения с помощью CMS GC:

jmap -dump:live,format=b,file=heap.hprof <pid>

Я открыл этот дамп с помощью YourKit, и он обнаружил, что 61% кучи 8Gb недоступен, в частности

Objects unreachable from GC roots, but not yet collected 126963949 5149290840 5149290840

Я думал, что использование -dump:live означает, что он будет содержать только достижимые объекты?

В файле gc.log для приложения подозрительно отсутствует какой-либо полный GC, вызванный моим вызовом jmap, и вместо этого отображаются следующие строки по обе стороны от моего дампа:

2019-07-17T09:32:59.808+0200: 33177.365: [GC (GCLocker Initiated GC) 2019-07-17T09:32:59.808+0200: 33177.365: [ParNew: 233127K->230550K(3397376K), 0.0265604 secs] 8029404K->8026859K(18496896K), 0.0267558 secs] [Times: user=0.92 sys=0.03, real=0.03 secs] 
2019-07-17T09:34:43.807+0200: 33281.363: [CMS-concurrent-preclean: 3.165/105.760 secs] [Times: user=143.74 sys=12.71, real=105.76 secs] 

В первой коллекции ParNew после первого сброса CMS после снятия дампа кучи я вижу, что куча примерно такого же размера, как и живая в дампе кучи (около 3-4 Гб):

2019-07-17T09:34:55.850+0200: 33293.407: [GC (GCLocker Initiated GC) 2019-07-17T09:34:55.850+0200: 33293.407: [ParNew: 3264332K->260834K(3397376K), 0.0435628 secs] 6814726K->3811241K(18496896K), 0.0438372 secs] [Times: user=1.45 sys=0.04, real=0.05 secs] 

Так что, может быть, в этом случае jmap не запускал полный сборщик мусора? Это возможно/настраивается?


person Graeme Moss    schedule 17.07.2019    source источник
comment
Какой JDK вы используете?   -  person Malt    schedule 11.08.2019
comment
Кажется, я использовал версию 1.8.0_131.   -  person Graeme Moss    schedule 12.08.2019


Ответы (2)


Это кажется неожиданным.

Вы можете попробовать использовать jcmd <pid> GC.heap_dump filename=MyHeapdump

Это новый рекомендуемый способ создания дампа кучи, который по умолчанию вызывает полный сборщик мусора. См. документацию по Oracle:

GC.heap_dump [параметры] [аргументы]

Создает дамп кучи Java в формате HPROF.

Воздействие: Высокое — зависит от размера и содержимого кучи Java. Запросить полный сборщик мусора, если не указан параметр -all.

person Alexandre de Champeaux    schedule 08.08.2019

Вот этот отчет об ошибке за 2015 год в котором говорится, что молодое поколение не собирается с помощью -dump:live. Я полагаю, что это поведение не было изменено.

person Bernhard Stadler    schedule 14.08.2019