当运行 top 时,看到我的 RES
是 4.7GB,这很好,因为我设置了 -Xmx8g
,但是当我将其转储到 hprof 文件时,我得到了大约一半的 gig 文件。
不是应该包含所有内存吗? 顺便说一句,即使我强制 GC(使用 jcmd),我仍然看到 4.7G 驻留。
最佳答案
堆转储文件(hprof)不是内存转储,而是对象堆转储。它仅包含 java 对象。
堆转储文件不包括 - 非堆内存区域(例如代码缓存、元空间等) - 一些堆对象(例如类)不包含在转储中 - 保留但未在堆中使用的空闲区域
就您而言,您可能有大量未使用的堆空间。 GC 不会将已用空间归还给 OS,因此 RES 大小仍为 4.7G
关于Java 堆转储(hprof 文件)比常驻内存小得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964475/