【发布时间】: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