我想弄清楚为什么Elasticsearch节点上的JVM堆使用率始终保持在80%以上。为了做到这一点,我通过运行
来进行堆转储jmap.exe -heap:format=b 5348
(5348是进程ID)。然后我可以用VisualVM分析转储。
问题是jmap
在进行转储时暂停JVM,因此该节点基本上处于脱机状态大约5分钟。
This article建议采用更快的方法,依赖于在Linux上使用gdb
的coredump。我已经尝试过WinDbg,它创建了一个核心转储,但我无法在VisualVM中使用它。
Windows是否有类似的方法?如何在几秒钟内完成堆转储,而不是几分钟?
答案 0 :(得分:6)
在您通过WinDbg
获取coredump之后,您需要通过运行
jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp
这可以离线完成;不需要与运行Java进程的交互。然后,您将能够在VisualVM中打开生成的heap.bin
。
或者你也可以选择班级直方图。它的生成速度比完全堆转储快。
jmap -histo <PID>
它显示了实例占用堆中空间最多的类的列表。这些信息通常足以让人了解内存丢失的位置。