当我的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
答案 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对象中找到。