jstat и jcmd дают разные ответы для метаскамерной памяти - PullRequest
2 голосов
/ 20 сентября 2019

В настоящее время я изучаю проблему сжатого пространства классов.Я знаю, в чем проблема, но во время исследования я заметил, что jstat -gc ... и jcmd ... GC.heap_info дают разное количество мета-пространства и сжатого пространства и использования пространства классов:

▶ jcmd 32152 GC.heap_info
32152:
 PSYoungGen      total 153600K, used 129316K [0x00000000eab00000, 0x00000000f5b00000, 0x0000000100000000)
  eden space 137728K, 91% used [0x00000000eab00000,0x00000000f26abf48,0x00000000f3180000)
  from space 15872K, 16% used [0x00000000f4100000,0x00000000f439d428,0x00000000f5080000)
  to   space 15872K, 0% used [0x00000000f3180000,0x00000000f3180000,0x00000000f4100000)
 ParOldGen       total 290816K, used 21446K [0x00000000c0000000, 0x00000000d1c00000, 0x00000000eab00000)
  object space 290816K, 7% used [0x00000000c0000000,0x00000000c14f1ac0,0x00000000d1c00000)
 Metaspace       used 59690K, capacity 64980K, committed 65192K, reserved 1103872K
  class space    used 9289K, capacity 10116K, committed 10152K, reserved 1048576K

▶ jstat -gc 32152
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
15872.0 15872.0 2677.0  0.0   137728.0 126711.2  290816.0   21446.7   63400.0 58060.7 9896.0 9067.2      8    0.047   3      0.118    0.164

Кажется, что цифры для емкости кучив целом совпадают (все выжившие, eden и old gen все согласны).Числа использования кучи не совпадают точно, но я не ожидал бы их;jstat было собрано примерно через секунду после jcm здесь.Но все числа метапространства отключены, причем числа jstat в целом немного ниже, чем числа jcmd.Я перезапустил обе команды, чтобы подтвердить, что между вызовами не происходила загрузка классов, и, действительно, обе команды дали те же выходные данные для чисел метапространства, что и раньше.

Что здесь происходит?Они измеряют эти числа немного по-другому?Что является более точным?

Информация о времени выполнения:

JVM: Java HotSpot(TM) 64-Bit Server VM (25.202-b08, mixed mode)
Java: version 1.8.0_202, vendor Oracle Corporation
-Xmx1024m
-XX:+UseParallelGC

1 Ответ

1 голос
/ 21 сентября 2019

Хороший улов!Числа действительно разные: значения jstat могут немного отставать, поскольку они обновляются только после GC , в то время как значения jcmd всегда текущие.

Таким образом, jcmd GC.heap_info должно быть более точным.

Также обратите внимание, что MC в выводе jstat соответствует фиксированному размеру метапространства, а не емкости.

...