heapdump size vs hprof size

时间:2012-07-26 09:47:54

标签: java visualvm heap-dump hprof yourkit

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

根据规范

,您可能需要传递实时选项
 -dump:<dump-options> 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.

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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