Java堆转储(hprof文件)比驻留内存小得多

Java堆转储(hprof文件)比驻留内存小得多,java,garbage-collection,heap-memory,Java,Garbage Collection,Heap Memory,当运行top时,我的RES是4.7GB,这很好,因为我设置了-Xmx8g,但是当我将它转储到hprof文件时,我得到了大约半个gig文件 难道不应该包含所有内存吗? 顺便说一下,即使我强制使用GC(使用jcmd),我仍然看到4.7G驻留。堆转储文件(hprof)不是内存转储,而是对象堆转储。它只包含java对象 堆转储文件不包括 -非堆内存(如代码缓存、元空间等) -某些堆对象(例如类)不包括在转储中 -保留但未在堆中使用的可用区域 在您的情况下,可能有很多未使用的堆空间。 GC不会将使用过的空

当运行top时,我的
RES
是4.7GB,这很好,因为我设置了
-Xmx8g
,但是当我将它转储到hprof文件时,我得到了大约半个gig文件

难道不应该包含所有内存吗? 顺便说一下,即使我强制使用GC(使用jcmd),我仍然看到4.7G驻留。

堆转储文件(hprof)不是内存转储,而是对象堆转储。它只包含java对象

堆转储文件不包括 -非堆内存(如代码缓存、元空间等) -某些堆对象(例如类)不包括在转储中 -保留但未在堆中使用的可用区域

在您的情况下,可能有很多未使用的堆空间。
GC不会将使用过的空间返回给操作系统,因此RES size保持在4.7G

我认为我的问题是相反的。我的hprof也很小,不包含所有对象。无论如何,在运行
GC.run
之后,它应该会释放一个驻留内存,不是吗?对此的解释将需要超过600个字符,因此要保持简短:不一定。你可以尝试他们在答案中解释的一些方法,但如果它们不起作用,我不知道该告诉你什么(可能是惊人的压缩?:),你可以尝试回答。。。有没有一种方法可以让所有的4.7吉格斯常驻?另一个简短的回答是:如果你调用它,它不会总是强迫GC运行,你可能想做一些关于这个问题的研究。要获得所有4.7 Gig,我建议您尝试使用visualvm或eclipse/jmap。这些选项通常为您提供一个选项来转储所有无效引用(基本上是应该收集但您仍然需要的“垃圾”)