排查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進程號

 

 5. Dump分析

  接下來就是dump文件分析了,分析工具有很多,比如:Jprofiler,MAT(MemoryAnalyzer) 等,找到具體內存泄露的代碼,解決問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM