jstat 和 jcmd 对元空间内存给出不同的答案

Bry*_*ead 5 java jvm jstat metaspace jcmd

我目前正在调查压缩类空间问题。我知道问题是什么,但在调查时,我注意到这一点jstat -gc ...,并jcmd ... GC.heap_info给出了不同数量的元空间和压缩类空间容量和使用情况:

\n\n
\xe2\x96\xb6 jcmd 32152 GC.heap_info\n32152:\n PSYoungGen      total 153600K, used 129316K [0x00000000eab00000, 0x00000000f5b00000, 0x0000000100000000)\n  eden space 137728K, 91% used [0x00000000eab00000,0x00000000f26abf48,0x00000000f3180000)\n  from space 15872K, 16% used [0x00000000f4100000,0x00000000f439d428,0x00000000f5080000)\n  to   space 15872K, 0% used [0x00000000f3180000,0x00000000f3180000,0x00000000f4100000)\n ParOldGen       total 290816K, used 21446K [0x00000000c0000000, 0x00000000d1c00000, 0x00000000eab00000)\n  object space 290816K, 7% used [0x00000000c0000000,0x00000000c14f1ac0,0x00000000d1c00000)\n Metaspace       used 59690K, capacity 64980K, committed 65192K, reserved 1103872K\n  class space    used 9289K, capacity 10116K, committed 10152K, reserved 1048576K\n\n\xe2\x96\xb6 jstat -gc 32152\n S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT\n15872.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\n
Run Code Online (Sandbox Code Playgroud)\n\n

堆容量的数字似乎总体上是匹配的(幸存者、伊甸园和老一代的所有容量都一致)。堆使用数字并不完全匹配,但我不希望它们完全匹配;jstat在此后大约一秒钟被收集jcm。但元空间的数字全部关闭,jstat总体数字略低于实际jcmd数字。我重新运行这两个命令以确认调用之间没有发生类加载,事实上,这两个命令为元空间编号提供了与以前相同的输出。

\n\n

这里发生了什么?他们对这些数字的衡量是否略有不同?哪个更准确?

\n\n

运行时信息:

\n\n
JVM: Java HotSpot(TM) 64-Bit Server VM (25.202-b08, mixed mode)\nJava: version 1.8.0_202, vendor Oracle Corporation\n-Xmx1024m\n-XX:+UseParallelGC\n
Run Code Online (Sandbox Code Playgroud)\n

apa*_*gin 4

接得好!这些数字确实不同: jstat 值可能会稍微落后,因为它们仅在 GC 之后更新,而 jcmd 值始终是最新的。

所以,jcmd GC.heap_info应该更准确。

另请注意,MCjstat 中的输出对应于元空间提交的大小,而不是容量。