Я использовал 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 не запускал полный сборщик мусора? Это возможно/настраивается?