В настоящее время я изучаю проблему сжатого пространства классов.Я знаю, в чем проблема, но во время исследования я заметил, что 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