不知道大家知不道自己專案中的JVM相關引數,比如設定的堆的記憶體是多少,新生代記憶體多少,什么垃圾回收器,GC頻率等等,所以這篇文章從實際出發探索專案中的JVM引數,
1.準備作業
記憶體分析工具準備:
有很多記憶體分析工具,如IBM的HeapAnalyzer,eclipse的MAT
這里使用eclipse的MAT
官方下載地址
常用命令:
top 查看監控整體資訊
jps 可以查看部署的Java Pid
jinfo 可以查看jvm相關引數
jstat 可以查看gc相關資訊,比如gc次數,新生代,老年代占比等等
jmap 用于查看堆資訊,當然也可以匯出dump檔案
這些都是命令列工具,當然也有可視化工具
jconsole,jvisualvm
2.直接開始
由于我們生產環境不允許操作,所以退而求次使用測驗環境來操作,
首先我是發現我們young gc比較頻繁,大概1分多鐘一次;full gc次數比較低,觸發young gc的條件就是eden區滿了,所以想知道為啥eden區這么快就滿了,可以看到YGC次數已經1061次了

引數含義在下邊再解釋
①使用top或者jps命令找到Java行程的Pid
top -b 找到java pid 35

jps 35

②使用jinfo查看我們的jvm資訊,可以看到新生代,老年代,垃圾回收器型別等等
jinfo -flags 35

我們一般用下列引數來初始化jvm引數
-Xms 最小堆記憶體
-Xmx 最大堆記憶體
-Xmn 新生代記憶體=-XX:newSize = -XX:MaxnewSize = -Xmn.也就是說-Xmn會同時設定前面2個引數
-XX:+UseXXGC 表示使用哪種GC
-XX:PermSize 設定永久代最小空間大小,
-XX:MaxPermSize 設定永久代最大空間大小,
-Xss 設定每個執行緒的堆疊大小,
-XX:NewRatio=n:設定年輕代和年老代的比值,如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4
-XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值,注意Survivor區有兩個,如:3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5
③使用jstat查看gc資訊
jstat -gcutil 35 以百分比展示堆資訊

各引數含義:
S0 survivor區
S1 survivor區
E eden區
O 老年代區
M jdk1.8是元空間 1.7是P 永久代
CCS 壓縮空間
YGC young gc 次數
YGCT young gc 耗時
FGC full gc 次數
FGCT full gc 耗時
GCT gc總耗時
可以參考這個
④使用jmap匯出堆疊資訊
jmap -dump:format=b,file=heap.hprof 35

⑤打開剛剛下載的MAT工具,左上角file將jmap匯出的heap.hprof檔案匯入MAT工具

這里我們主要關注 leak suspects,很貼心,已經把可能發生記憶體泄露的地方給我們找出來了,點進去看看,

可以看到上面26.47%的記憶體都是我打碼的物件,這個類是全鏈路的監控的類,用于產生攔截物件,可以猜測一下,全鏈路我們是用Java探針接入的,類似于代理,在我們請求前后使用攔截器攔截收集我們的請求資訊,然后請求完了,就可以回收攔截器物件了,所以可以看到我們eden區由于創建攔截器物件很快就慢了,然后又被ygc回收掉,
當然實際排查程序中沒有這么簡單,通常隱藏層級很深,這是就要用到其他特性了,
比如Dominator Tree: 可以看到物件所占記憶體占比,我們就可以優先排查那些大物件

可以看到上圖的Shallow Heap 和 Retained Heap
Shallow Heap 和 Retained Heap的含義:
Shallow Heap:是物件本身占據的記憶體的大小,不包含其參考的物件
Retained Heap:當前物件大小+當前物件可直接或間接參考到的物件的大小總和,(間接參考的含義:A->B->C,C就是間接參考) ,并且排除被GC Roots直接或者間接參考的物件
具體區別可以參考這篇文章:
添加鏈接描述
而這個物件被gc回收釋放的記憶體就是Retained Heap
然后點擊物件進行 點擊list objetcs incoming 和 outgoing references分析
incoming references:參考該物件的物件
outgoing references:該物件參考的物件
比如A,B參考C,C參考D,E
站在C的角度,AB就是C的incoming references,DE是C的outgoing references

我們這是查看的outgoing references,也就是該物件參考的物件,可以看到有一個array,里面全是攔截器物件,可以印證我們剛剛上面說的

大體流程就是這樣,大家不懂多搜,多嘗試,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252061.html
標籤:其他
上一篇:CentOS 7 安裝 python3+pip3+chrome+chromedriver+selenium+requests 無GUI運行腳本
下一篇:2021-01-23
