2016-05-01 229 views
1

当运行top时看到我的RES是4.7GB,这很好,因为我设置了-Xmx8g,但是当我将它转储到hprof文件时,我获得了大约一半演出文件。Java堆转储(hprof文件)比常驻内存小得多

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

+0

http://stackoverflow.com/questions/11666667/heapdump-size-vs-hprof-size – user2494817

+0

我认为我的问题是相反的。我的hprof也很小,不包含所有对象。无论如何,在运行'GC.run'之后,它应该是免费的常驻内存,不是吗? – Nati

+0

对此的解释需要超过600个字符,因此要保持简短:不一定。你可以尝试一些他们在答案中解释的方法,但如果他们不工作,我不知道该告诉你什么(可能是惊人的压缩?:)) – user2494817

回答

0

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

堆转储文件不包括 - 的存储器非堆arreas(例如代码高速缓存中,元空间,等等) - 一些堆中的对象(例如类)不包括在转储 - 保留自由区域但在不使用堆

在你的情况,你可能有很多未使用的堆空间。 GC不会将已用空间返回给操作系统,所以RES的大小仍然为4.7G

相关问题