【问题标题】:heapdump size vs hprof sizeheapdump 大小与 hprof 大小
【发布时间】:2012-07-26 09:47:53
【问题描述】:

当我的 jboss 服务器以 4096m 的 xms 和 4096m 的 xmx 以及 512m 的 permsize 运行时,我最近制作了一个 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

【问题讨论】:

  • 你能发布 VisualVM 的“摘要”选项卡的屏幕截图吗?
  • 我无法添加屏幕截图,但我确实添加了 yourkit 中的信息
  • YourKit 中的数据对我没有帮助 - 我不知道它们是如何计算的。我知道这是如何在 VisualVM 中完成的。如果您希望我帮助您,请提供“基本信息”部分的数据(副本在上下文菜单中),或者您可以将压缩的堆转储上传到某处并将链接发送给我。
  • 嗨,Thomas,由于安全限制,我无法为您提供堆转储,但我可以为您提供基本信息: 拍摄日期:2012 年 7 月 20 日星期五 14:23:43 CEST 文件: OutofMemoryProd \ 20120720-20120723 \ fofo1 \ java_11607_lnx0399vm_201207201423.hprof \ java_11607_201207201423.hprof \ java_11607_201207201423.hprof \ java_11607_201207201423.hprof文件大小:5.147,4 Mb总数最终确定:0
  • "GC 根:0" - 这是非常可疑的。您的堆转储似乎有问题。

标签: java visualvm heap-dump hprof yourkit


【解决方案1】:

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

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

根据规范,您可能需要通过 live 选项

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

【讨论】:

  • 您好,我们使用以下命令: jmap -F -dump:format=b,file=${filename} $PID 。根据 oracle 的 live 选项:“如果指定,则仅转储堆中的活动对象。”所以如果我指定这个,堆转储很可能会更小,但也可能会降低我找到内存泄漏原因的机会
  • 这是个好问题——什么是活体?我假设活动对象是 GC 不可用的东西。所以我猜 live 选项只会删除垃圾对象,你只会有活的对象 - 这并不意味着这会减少找到的机会......我最近确实发现了一些内存泄漏,在非常大的转储中使用 live 选项(大约 16 GB) ...
  • 您好安德烈,感谢您的回复。 “我最近确实在非常大的转储(大约 16 GB)中使用实时选项发现了很少的内存泄漏”我可以想象这可能会有所帮助,但为什么磁盘上的 hprof 大小和当我在此类工具中加载 hprof(堆转储)时分析器工具显示的大小...
【解决方案2】:

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

【讨论】:

  • 如何获取指定类型int Unreachable Objects Histogram的值?比如我发现java.lang.String占用了500M,但是找不到string是什么。我只能得到类型是什么以及类型的总大小,但在 Eclipse Memory Analyzer 中找不到内容。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 2021-02-20
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多