如何在窗口中以最小的停机时间进行堆转储?

时间:2016-03-04 09:55:10

标签: elasticsearch jvm heap-dump jmap

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

来进行堆转储
jmap.exe -heap:format=b 5348

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

问题是jmap在进行转储时暂停JVM,因此该节点基本上处于脱机状态大约5分钟。

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

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

1 个答案:

答案 0 :(得分:6)

在您通过WinDbg获取coredump之后,您需要通过运行

从中提取堆转储
jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp

这可以离线完成;不需要与运行Java进程的交互。然后,您将能够在VisualVM中打开生成的heap.bin

或者你也可以选择班级直方图。它的生成速度比完全堆转储快。

jmap -histo <PID>

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