1. 程式人生 > 實用技巧 >排查JVM記憶體洩漏的命令

排查JVM記憶體洩漏的命令

1. jps

  使用 jps -l -m 獲取到當前jvm程序的pid,通過上述命令獲取到了服務的程序號

jps(JVM Process Status Tool):顯示指定系統內所有的HotSpot虛擬機器程序
jps -l -m :引數-l列出機器上所有jvm程序,-m顯示出JVM啟動時傳遞給main()的引數

2. jstat

  使用 jstat 觀察jvm狀態,因為是OOM異常,所以我們首先重啟機器觀察了JVM的執行情況;

  我們使用 jstat - gc pid time命令觀察GC,發現GC在YGC後,GC掉的記憶體並不多,每次YGC後都有一部分記憶體未回收,導致在多次YGC後回收不掉的記憶體被挪到堆的old區,old滿了之後FGC發現也是回收不掉;

  這裡基本可以確定是記憶體洩漏的問題了,下面我們有簡單看了下機器的cpu、記憶體、磁碟狀態

jstat(JVM statistics Monitoring)是用於監視虛擬機器執行時狀態資訊的命令,它可以顯示出虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料。
jstat - gc pid time :-gc 監控jvm的gc資訊,pid 監控的jvm程序id,time每個多少毫秒重新整理一次
jstat - gccause pid time :-gccause 監控gc資訊並顯示上次gc原因,pid 監控的jvm程序id,time每個多少毫秒重新整理一次
jstat - class pid time:-class 監控jvm的類載入資訊,pid 監控的jvm程序id,time每個多少毫秒重新整理一次

3. top

  使用 top -p pid 獲取程序的cpu和記憶體使用率;檢視RES 和 %CPU %MEM三個指標:

VIRT:virtual memory usage 虛擬記憶體 

1、程序“需要的”虛擬記憶體大小,包括程序使用的庫、程式碼、資料等
2、假如程序申請100m的記憶體,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量 RES:resident memory usage 常駐記憶體
1、程序當前使用的記憶體大小,但不包括swap out
2、包含其他程序的共享
3、如果申請100m的記憶體,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用記憶體的情況,它只統計載入的庫檔案所佔記憶體大小 SHR:shared memory 共享記憶體
1、除了自身程序的共享記憶體,也包括其他程序的共享記憶體
2、雖然程序只使用了幾個共享庫的函式,但它包含了整個共享庫的大小
3、計算某個程序所佔的實體記憶體大小公式:RES – SHR 4、swap out後,它將會降下來 DATA
1、資料佔用的記憶體。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程式要求的資料空間,是真正在執行中要使用的。 ps : 如果程式佔用實存比較多,說明程式申請記憶體多,實際使用的空間也多。如果程式佔用虛存比較多,說明程式申請來很多空間,但是沒有使用。

  這個命令是檢視計算機的狀態,如果沒有程序佔用過多的計算機資源,就基本可以確定是JVM記憶體洩露問題,針對JVM程序拍排查問題就好了。

4. jmap

  我們使用 jmap -dump : format=b, file=dump_file_name pid 命令,將當前機器的jvm的狀態dump下來或缺的一份dump檔案,用做下面的分析

jmap(JVM Memory Map)命令用於生成heap dump檔案,還可以查詢finalize執行佇列、Java堆和永久代的詳細資訊,如當前使用率、當前使用的是哪種收集器等。
jmap -dump : format=b, file=dump_file_name pid :file=指定輸出資料檔名, pid jvm程序號