Java 为什么堆转储和活动堆大小之间存在差异?

Java 为什么堆转储和活动堆大小之间存在差异?,java,heap-memory,Java,Heap Memory,我试图使用sudo watch-d-n1 jstat-gc 2342来查找并分析我的应用程序的堆内存,它显示为4GB堆大小: S0C S1C S0U S1U EC EU OC OU 18432.0 17920.0 7736.5 0.0 1711104.0 638785.9 3495424.0 831624.7 MC MU CCSC CCSU YGC YGC

我试图使用
sudo watch-d-n1 jstat-gc 2342来查找并分析我的应用程序的堆内存,它显示为4GB堆大小

S0C     S1C     S0U     S1U   EC        EU       OC          OU        
18432.0 17920.0 7736.5  0.0   1711104.0 638785.9 3495424.0   831624.7

MC       MU       CCSC    CCSU     YGC   YGCT      FGC   FGCT    GCT  
447616.0 185520.7 80512.0 23790.2  67039 2248.559  62    111.219 2359.778
但是当我使用命令进行堆转储时
jmap-dump:live,format=b,file=/tmp/dump.hprof 12587
,我看到转储的大小小于GB。为什么会发生这种情况?

欢迎来到SO!我试图美化你的问题…IIRC的区别在于可用空间和实际使用空间之间的区别。如果程序需要内存,4GB的其余部分将用于扩展。它还可能与系统上运行的其他程序的分配堆重叠。不是Java堆和堆转储方面的专家,但可能4GB包含仍在等待GC的死对象?您的jmap转储显式地排除了这些(
-dump:live
),所以这可能就是原因?