heapdump size vs hprof size

当我的jboss服务器以4096m的xms和4096m的xmx以及512m的permsize运行时,我最近以hprof格式创建了一个heapdump。

生成的hprof文件超过5GB。 当我在visualvm,mat analyzer或yourkit中加载heapdump时,我只看到大约1gb的总字节数。 我已尝试更改yourkit中的可访问性范围,但它不会显示超过1 GB。

知道文件大小与显示的堆转换大小有什么重大差异会导致什么?

ps:我正在使用jdk1.6.0_23

不幸的是我不允许在这里提交截图。

在文件系统上,hprof大小为5.227.659 kb,在yourkit中它指出:

对象:9.738.282 /浅尺寸740 mb /保留大小:740 mb其中可达到的字符串:6.652.515(68%)/浅尺寸:381 mb(51%)/保留大小:381 MB(51%)

保留的最大大小是一个字节[] 206.810.176

您使用哪个命令生成堆转储?

$JAVA_HOME/bin/jmap -dump:live,format=b,file=c:/tmp/heap_dump.bin PID 

根据规格,也许你需要通过实时选项

  -dump: to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified, all objects in the heap are dumped. 

您是否尝试过“无法访问的对象直方图”(您可以在“概述”页面的顶部找到该链接)? 在我的一个大小为1509MB的堆叠中,垫子只显示454MB,但其余部分基本上是垃圾,果然,无法到达的对象直方图中“浅堆”的总和是966MB。

这只意味着你的堆转储很可能包含大量无法访问的对象,如果要运行GC,这些对象将被垃圾回收。 现在这并不意味着你仍然没有泄漏,这只意味着在你的5 GB Hprof中,4 GB的物体无法到达,因此不是有趣的泄漏源。

在Java中,只有当垃圾收集无法清除对象时才会发生内存泄漏,因为某些内容正在持有对它的引用(意外)。 因此,您的泄漏(如果有的话)可以在您的hprof中保留的1 GB对象中找到。