当前位置: 首页 > 知识库问答 >
问题:

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

南宫阳焱
2023-03-14

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

▶ 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

堆容量的数字似乎总体上是匹配的(幸存者、伊甸园和老一代所有容量都同意)。堆使用数字不完全匹配,但我不希望它们匹配;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个答案

璩涵衍
2023-03-14

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

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

另请注意,jstat输出中的MC对应于metaspace提交的大小,而不是容量。

 类似资料:
  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的

  • 我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的

  • 在JVM重启之前,java(8)内存容量是否会减少? 我正在使用jstat-gc转储内存信息,下面是两天的快照。与第一个快照相比,第二个快照对SC1和EC的资本金更少。 有人能帮助/解释为什么我看到这种行为吗?这是预期的吗?

  • 问题内容: public class Test { public static void main(String[] args) { int i = 10; i = i++; System.out.println(“value of i is : ” + i); } } 输出为: 当我在执行类似的代码时,输出为。 问题答案: 关于此问题,这是未定义的行为,因为您试图在同一行的同一序列点内多次修改同

  • Java虚拟机在执行的时候会把管理的内存分配到不同的区域,这些区域称为虚拟机内存;同时对于虚拟机没有直接管理的物理内存,也会有一定的利用,这些被利用但不在虚拟机内存的地方称为本地内存。 JVM内存:受虚拟机内存大小的参数控制,当大小超过参数设置的大小时会报OOM。 本地内存:本地内存不受虚拟机内存参数的限制,只受物理内存容量的限制;虽然不受参数的限制,如果所占内存超过物理内存,仍然会报OOM。 虚

  • 我有两种日期格式,一种是字符串“yyyy-mm-dd'hh:mm:ss.sssz”,另一种是长的“yyyymmddhhmmsssss”。我想把它转换成这个格式“yyyy-mm-dd hh:mm:ss”,它转换成功了,但是当我打印date.getTime()时 对于第一个->1416490009109 用于秒->20141120121211800 代码: 对于第二个