You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:30:43