如何在窗口中进行堆转储,停机时间最短?

sve*_*i-n 3 jvm jmap heap-dump elasticsearch

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

jmap.exe -heap:format=b 5348
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

apa*_*gin 8

在您获取coredump之后WinDbg,您需要通过运行从中提取堆转储

jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp
Run Code Online (Sandbox Code Playgroud)

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


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

jmap -histo <PID>
Run Code Online (Sandbox Code Playgroud)

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