我想知道为什么JVM堆在Elasticsearch节点上的使用率一直保持在80%以上。为了做到这一点,我通过运行
jmap.exe -heap:format=b 5348
(5348是进程ID)。然后我就可以用VisualVM来分析转储。
问题是jmap
在进行转储时暂停JVM,因此节点基本上离线大约5分钟。
这篇文章提出了一种更快的方法,它依赖于在Linux上使用gdb
。我已经尝试过WinDbg,它创建了一个核心转储,但是我无法在VisualVM中使用它。
Windows有类似的方法吗?怎样才能在几秒钟内,而不是几分钟内,就能得到堆转储?
发布于 2016-03-06 01:57:16
在您通过WinDbg
获取核心节点之后,您需要通过运行
jmap -heap:format=b "C:\Program Files\Java\...\bin\java.exe" core.mdmp
这可以脱机完成;不需要与运行Java进程进行交互。然后,您将能够在heap.bin
中打开生成的VisualVM。
或者,您可以使用类直方图。它产生的速度比全堆转储更快。
jmap -histo <PID>
它显示了实例在堆中占据最大空间的类的列表。这些信息通常足以让人知道内存丢失在哪里。
https://stackoverflow.com/questions/35792936
复制相似问题