堆转储大小VS HPROF大小(heapdump size vs hprof size)

2019-09-20 05:51发布

我最近在一个HPROF格式做了一个堆转储,当我的JBoss服务器与4096米和4096米的XMX的XMS和512M的一个permsize运行。

生成的HPROF文件超过5GB。 当我的VisualVM,垫分析器或yourkit加载堆转储,我只看到约1GB的总字节数。 我试着改变了yourkit可达范围,但它并没有显示超过1 GB。

任何想法在文件大小VS显示堆转储规模这么大的差异可能会导致?

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一个字节

Answer 1:

该命令没有用来生成堆转储?

$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.


Answer 2:

你尝试“不可达的对象直方图”(你可以找到“概述”页面顶部的链接)? 在我heapdumps之一大小1509MB,垫只显示454MB,但其余的基本上是垃圾,果然,在不可达的对象直方图“浅堆”的总和为966MB。



Answer 3:

这只是意味着,很可能是你堆转储包括大量那会是垃圾回收,如果GC是跑不可达的对象的。 现在,这并不意味着你不还是有漏洞,那只是意味着你5 GB HPROF,4 GB的对象是无法到达,因此不泄漏的有趣新闻来源。

在Java中,如果因为事情是持有对它的引用(意外)垃圾收集不能清除的对象只能发生内存泄漏。 所以,你的泄漏(如果有的话)是在1 GB的留在你的HPROF物体被发现。



文章来源: heapdump size vs hprof size