Java線上內存溢出問題排查步驟


參考:

java線上內存溢出問題排查步驟

Java線上內存溢出問題排查步驟

1、使用top對當前服務器內存有個大致了解top后 shift+M俺內存占用由大到小排序
2、利用ps命令查看服務pid:ps -aux|grep java

3、利用jstat查看虛擬機gc情況

jstat  -gc:util <vmid>  [<interval> [<count>]
vmid:虛擬機進程號
interval:采樣時間,默認單位是ms
count:采樣條數
[root@speedyao java]# jstat -gcutil 17561 1000 10
 以上命令代表1秒鍾采樣1次,總共采樣10次。
如果FULL GC明顯大於YOUNG GC次數,並且FULL GC次數很頻繁,說明程序有大內存對象,並且一直無法釋放。
4、生成dump文件,有兩種方式。 一種是利用jmap直接生成dump文件;另一種是利用gcore先生成core文件,再根據core文件利用jmap生成dump文件。

(1)先說第一種,這種比較簡單,使用這種方案的時候請注意:JVM會將整個heap的信息dump寫入到一個文件,heap如果比較大的話,就會導致這個過程比較耗時,並且執行的過程中為了保證dump的信息是可靠的,所以會暫停應用。

 

[root@speedyao java]# jmap -dump:format=b,file=heap.prof  17561 
format=b:表示生成二進制類型的dump文件
file=:后面寫的是輸出的dump文件路徑
17561:jvm進程id
(2)接下來是第二種。這一種在jmap轉換core文件的時候比較耗時,並且生成的dump文件用mat打開的時候分析結果不太正確,不太好定位問題。所以我建議使用第一種,雖然會造成服務掛起吧,但是結果總歸是正確的。
優勢:利用gcore保存服務的內存信息,因為gcore比jmap的dump會快很多,也不對線上服務有大的影響。
利用jmap將gcore文件轉換為java的dump文件,這一步執行的比較慢,可以用nohup執行,以防止誤點Ctrl+C導致退出。
5、利用MAT或者 jdk自帶的jvisualvm.exe 來分析dump文件
在MAT工具中一般用到比較多的2個功能
1、Histogram
2、Leak Suspects

Histogram

這個功能主要是查看類和對象關系,對象和對象之間的關系,用來定位哪些對象在FGC之后還活着,哪些對象占大部分內存。

Leak Suspects

Leak Suspects 界面提示可能存在內存的泄露。有的時候具體代碼的位置都幫我們定位好了,排查非常方便。

JVM加上 -XX:+HeapDumpOnOutOfMemoryError 這個參數,系統 oom的時候會自動dump的,到時候拿快照MAT中分析即可。


免責聲明!

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



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