2016-03-04 35 views
2

我想弄清楚爲什麼Elasticsearch節點上的JVM堆使用率始終保持在80%以上。爲了做到這一點,我通過運行堆轉儲如何以最少的停機時間在堆中轉儲堆?

jmap.exe -heap:format=b 5348 

(5348是進程ID)。然後我可以用VisualVM分析轉儲。

問題是jmap在轉儲時暫停了JVM,因此該節點基本上離線了大約5分鐘。

This article表示一種更快的方法,它依靠在Linux上使用coredump與gdb。我已經嘗試過創建核心轉儲的WinDbg,但是我無法在VisualVM中使用它。

對Windows有沒有類似的方法?如何在幾秒鐘內完成堆轉儲,而不是幾分鐘?

+0

我會確保a)您使用的是二進制模式b)您的堆儘可能小,最小化堆大小,在轉儲之前觸發完整的GC。 –

+0

嗨,彼得。我使用二進制模式,看到我編輯的問題,併爲混淆抱歉。由於這是生產機器,運行大量數據,因此我不能擁有更小的堆。 –

+0

進行堆轉儲不會很便宜,因爲它將不得不停止JVM以獲取一致快照中的所有數據。 –

回答

5

你已經通過WinDbg採取信息轉儲後,您需要通過運行

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

這可以離線進行,以從中提取堆轉儲;不需要與運行的Java進程進行交互。然後,您將能夠在VisualVM中打開生成的heap.bin


另外,您可以採取類直方圖。它的生成速度比完整的堆轉儲更快。

jmap -histo <PID> 

它向您顯示其實例佔據堆中空間最多的類的列表。這些信息通常足以讓我們瞭解內存丟失的情況。

+0

謝謝@apangin,這兩種解決方案都很棒! –