前段時間線上服務經常發生卡頓,經過排查發現是大對象引起的Fullgc問題,特此記錄排查邏輯。
目的
定位產生大對象的代碼
一、獲得服務進程
jps -l
27885\32474 對應的即為運行的Jar
ps:也可使用netstat -lnput|grep 啟動端口號 等方式查找
二、生成dump文件
jmap -dump:format=b,file=文件路徑及名字.dump 上步獲得進程號
#jmap -dump:format=b,file=test.dump 27885
三、下載mat工具
四、使用mat工具導入第二步生成的dump文件
五、導入后得到如下界面
六、定位大對象(方法一)
-
點擊上圖中Histogram,可顯示出每個類產生的實例數量,以及所占用的內存大小;
Shallow Heap 和 Retained Heap分別表示對象自身不包含引用的大小和對象自身並包含引用的大小。默認的大小單位是 Bytes,可以在 Window - Preferences 菜單中設置單位,圖中設置的是KB。 -
根據Shallow Heap 和 Retained Heap找出占用最大的對象(下圖)
紅框內就是我的包路徑,這時已經大概知道是什么對象占用了,去項目中檢查大概率能定位,我遇到的是一次性查出全部的數據,太多導致。
七、定位大對象(方法二)
點擊第五步圖中 Leak Suspects 后,MAT會自動分析生成一份報告,通過報告,也能判斷出和上一步一樣的結果
最后,找到代碼位置了,其他就是要分析具體是什么原因導致產生大對象。針對問題進行代碼、JVM、業務需求優化。