一尘不染

如何以最少的停机时间在Windows中进行堆转储?

elasticsearch

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

jmap.exe -heap:format=b 5348

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

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

本文提出了一种更快的方法,该方法依赖于gdb在Linux 上使用coredump
。我已经尝试过WinDbg,它创建了一个核心转储,但是我无法在VisualVM中使用它。

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


阅读 211

收藏
2020-06-22

共1个答案

一尘不染

在使用coredump以后WinDbg,您需要通过运行以下命令从中提取堆转储

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

这可以脱机完成;无需与运行中的Java进程进行交互。然后,您将能够heap.bin在VisualVM中打开生成的文件。


或者,您可以获取班级直方图。它产生的速度比完整堆转储的速度快。

jmap -histo <PID>

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

2020-06-22