我目前正在调查一个压缩类空间问题。我知道这个问题是什么,但是在调查的时候,我注意到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
抓得好!数字确实不同: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 代码: 对于第二个