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) 等,找到具體內存泄露的代碼,解決問題。