4

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

生成的 hprof 文件超过 5gb。当我在 visualvm、mat 分析器或 yourkit 中加载堆转储时,我只看到大约 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 的 byte[]

4

3 回答 3

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.
于 2012-07-26T10:22:12.023 回答
2

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

于 2012-07-27T07:45:19.760 回答
1

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

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

于 2013-09-20T22:02:55.593 回答