【问题标题】:How to take a heap dump in windows with minimum downtime?如何以最少的停机时间在 Windows 中进行堆转储?
【发布时间】:2016-06-18 00:06:21
【问题描述】:

我想弄清楚为什么 Elasticsearch 节点上的 JVM 堆使用率一直保持在 80% 以上。为了做到这一点,我通过运行进行堆转储

jmap.exe -heap:format=b 5348

(5348 是进程 ID)。然后我可以用 VisualVM 分析转储。

问题是jmap在进行转储时暂停了JVM,所以节点基本离线5分钟左右。

This article 建议一种更快的方法,该方法依赖于在 Linux 上使用 gdb 进行核心转储。我已经尝试过创建核心转储的 WinDbg,但我无法在 VisualVM 中使用它。

Windows 是否有类似的方法?如何在几秒钟而不是几分钟内完成堆转储?

【问题讨论】:

  • 我会确保,a)您使用的是二进制模式 b)您的堆在开始时尽可能小,例如最小化堆大小并在进行转储之前触发完整的 GC。
  • 嗨,彼得。我使用二进制模式,请参阅我编辑过的问题,并对造成的混淆感到抱歉。我不能有更小的堆,因为这是生产机器,运行大量数据。
  • 进行堆转储并不便宜,因为它必须停止 JVM 才能在一致的快照中获取所有数据。
  • @apangin - 现在可能很清楚,但不是在它被标记为垃圾邮件/攻击性时。

标签: elasticsearch jvm heap-dump jmap


【解决方案1】:

通过WinDbg 获取核心转储后,您需要通过运行从中提取堆转储

jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp

这可以离线完成;无需与正在运行的 Java 进程交互。然后就可以在VisualVM中打开生成的heap.bin了。


或者,您可以采用类直方图。它的生成速度比完整堆转储快。

jmap -histo <PID>

它会显示实例在堆中占据最多空间的类的列表。这些信息通常足以了解内存丢失的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 2023-04-01
    • 2013-09-02
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多