【问题标题】:Loading a large hprof into jhat将大型 hprof 加载到 jhat
【发布时间】:2010-12-22 14:04:57
【问题描述】:

我有一个 6.5GB 的 Hprof 文件,该文件由 64 位 JVM 使用 -XX:-HeapDumpOnOutOfMemoryError 选项转储。我把它放在一台 16GB 的 64 位机器上,并试图将它放入 jhat,但它总是内存不足。我尝试传入 jvm args 以获得最小设置,但它拒绝任何最小值,并且似乎在达到最大值之前就耗尽了内存。

内存不足的 jvm 会转储一个如此大的堆,以至于无法将其加载到具有两倍内存的机器上,这似乎有点愚蠢。有没有办法让这个运行,或者可能摊销分析?

【问题讨论】:

标签: java memory-leaks jvm heap-memory jhat


【解决方案1】:

使用相当于jhat -J-d64 -J-mx16g myheap.hprof 的命令来启动 jhat,也就是说,这将以 64 位模式启动 jhat,最大堆大小为 16 GB。

如果您平台上的 JVM 默认为 64 位模式操作,那么 -J-d64 选项应该是不必要的。

【讨论】:

    【解决方案2】:

    我会看看eclipse memory analyzer。这个工具很棒,我用这个工具查看了几个 Gig 堆。该工具的好处是它在转储上创建索引,因此它不会一次全部在内存中。

    【讨论】:

    • 这行得通。实际上,我之前尝试过一些较小的堆转储,它确实没有给我任何有用的信息,但是一旦我使用 HeapDumpOnOutOfMemoryError hprof 得到它,它终于指出了确切的问题。
    • 不幸的是 MAT 仍然为我使用了相当多的 RAM ["failure java heap space"],请参阅 stackoverflow.com/questions/7254017/…
    【解决方案3】:

    我必须加载一个 11 GB 的 hprof 文件,而不能使用 eclipse 内存分析器。我最终做的是编写一个程序,通过随机删除实例信息来减小 hprof 文件的大小。一旦我将 hprof 文件的大小降低到 1GB,我就可以使用 eclipse 内存分析器打开它,并了解导致内存泄漏的原因。

    【讨论】:

    • 愿意分享工具或详细说明如何编写类似的工具?
    【解决方案4】:

    你传递给 jhat 的标志是什么?确保您处于 64 位模式并且您将堆大小设置得足够大。

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2020-04-10
      • 2017-11-30
      • 2017-11-16
      • 1970-01-01
      相关资源
      最近更新 更多