【问题标题】:How can I take a heap dump on Java 5 without garbage collecting first?如何在不先进行垃圾收集的情况下在 Java 5 上进行堆转储?
【发布时间】:2010-11-19 02:15:21
【问题描述】:

我们有一个运行 Java 5 的长期运行的服务器应用程序,对其进行分析我们可以看到老一代随着时间的推移缓慢增长。它在完整的 GC 上被正确释放,但我希望能够使用堆转储查看 Eclipse MAT 中无法访问的对象。我已经使用 +XX:HeapDumpOnCtrlBreak 成功获得了堆转储,但是 JVM 总是在转储堆之前进行 GC。显然这不会发生在 Java 6 上,但我们现在停留在 5 上。有什么办法可以预防吗?

【问题讨论】:

    标签: java garbage-collection heap-memory


    【解决方案1】:

    我建议使用 3rd-party profiler,例如 YourKit,它可以让您在不先启动 GC 的情况下拍摄快照。额外的好处是,您可以在没有整个 ctrl-break 恶作剧的情况下拍摄快照。

    【讨论】:

    • 谢谢,我实际上有一个 JProfiler 的副本,但我没有意识到它可以做到这一点。我试试看。
    【解决方案2】:

    jProfiler (ej-technologies) 可以做到这一点。

    【讨论】:

      【解决方案3】:

      我这里有一些代码可以通过 JMX 以编程方式进行堆转储:

      链接:JmxHeapDumper.java

      源代码中的 cmets 包含 2 个指向文章的链接,这些文章包含有关如何进行堆转储的有用信息。我不确定,但如果你幸运的话,也许 JMX 方法可以避免 GC。希望这会有所帮助!

      【讨论】:

      • 太好了,谢谢,我去看看它是否提前 GC。实际上,能够以编程方式执行此操作似乎非常有用。
      【解决方案4】:

      您是否尝试过 JDK 附带的标准 jmap 工具? jmap 收费是在 Java 5 中正式引入的。

      命令行示例: /java/bin/jmap -heap:format=b

      可以使用标准的 jhat 工具或 MAT 等 GUI 应用程序处理结果。

      【讨论】:

        【解决方案5】:

        使用 jconsole 或 visualvm 或 jmc 或 ... 其他 jmx 管理控制台。 在 com.sun.management 中打开 HotSpotDiagnostic。 选择方法dumpHeap 并输入两个参数:

        • 转储文件的路径
        • (true/false)仅转储活动对象。使用false 转储所有对象。

        请注意,转储文件将由您连接的 JVM 写入,而不是由 JVisualVM 写入,因此如果 JVM 在不同的系统上运行,它将在该系统上写入。

        【讨论】:

        • 请注意,VisualVM 为此需要 VisualVM-MBeans 插件。
        猜你喜欢
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 2012-03-26
        • 2012-06-15
        • 2012-03-28
        • 2011-07-16
        • 2011-07-16
        相关资源
        最近更新 更多