我最近在一个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一个字节
该命令没有用来生成堆转储?
$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.
你尝试“不可达的对象直方图”(你可以找到“概述”页面顶部的链接)? 在我heapdumps之一大小1509MB,垫只显示454MB,但其余的基本上是垃圾,果然,在不可达的对象直方图“浅堆”的总和为966MB。
这只是意味着,很可能是你堆转储包括大量那会是垃圾回收,如果GC是跑不可达的对象的。 现在,这并不意味着你不还是有漏洞,那只是意味着你5 GB HPROF,4 GB的对象是无法到达,因此不泄漏的有趣新闻来源。
在Java中,如果因为事情是持有对它的引用(意外)垃圾收集不能清除的对象只能发生内存泄漏。 所以,你的泄漏(如果有的话)是在1 GB的留在你的HPROF物体被发现。