JVM堆内存统计数值不符疑问:Eden+Survivor+Old与堆使用量为何不等
jcmd GC.heap_info与jstat -gc堆内存数值差异的原因
两者数值不相等的核心原因是两个工具的统计范围和逻辑不同,具体遗漏的内容包括:
G1特有的记忆集(Remembered Set, RS):
G1垃圾收集器为了追踪跨Region的引用,会在堆内存中维护记忆集结构,这部分内存属于堆的一部分,会被jcmd GC.heap_info统计到已用内存中,但jstat -gc的输出里没有对应的指标,也不会将其包含在S1U、EU或OU的数值里。Humongous区域的统计差异:
G1中会将大于Region一半大小的大对象放在Humongous区域,部分JDK版本的jstat -gc不会把这部分区域的已用内存计入OU(老年代已用),但jcmd GC.heap_info会将其算入堆的总已用内存。未计入的Survivor区内存:
你只累加了S1U(S1幸存区已用),如果当时S0幸存区有已用内存(对应jstat输出中的S0U),这部分未被计入的数值也会拉大差异(不过从你的数值差距来看,这不是主要因素)。
简单来说,jcmd GC.heap_info统计的是整个G1堆的全部已用内存,包括对象存储、GC辅助结构等所有堆内占用;而jstat -gc的分代累加仅覆盖了常规年轻代和老年代的对象存储内存,未包含G1特有的堆结构开销。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

