mat分析記憶體總結--效能分析
主要是工作中發現後臺專案有時候話boom,看日誌也會偶爾看到記憶體不足的報錯。為了定位原因改善由於記憶體問題引起的效能問題特做個總結給大家參考。主要分了三個階段做這個事情。由於截圖及指令碼涉及業務省略,有需要歡迎留言交流。
初步思路
後臺系統性能參考指標很多方面需要參考,本次實踐主要針對應用伺服器的記憶體作為主要檢測指標。主要思路如下:
1、TOP+Hp找到最大耗cpu執行緒,依賴jstack簡單的找到執行緒耗cpu所在堆疊
2、實時監控記憶體回收狀況如:jstat
3、在記憶體回收異常點儲存堆疊映象如:hump -dump:live,format=b,file=heap.bin pid
4、利用堆疊分析工具分析堆疊映象定位可能耗效能程式碼
第一階段
選用mat外掛分析堆疊映象,本地搭建好環境,主要目的及內容如下:
1、搭建基於eclipse的mat外掛
2、確立主要檢測指標及定位前提
3、思考怎麼實時監控效能的指標
第二階段
在效能不好的情況分析堆疊最有可能發現效能瓶頸,映象檔案是保留現場的重要檔案。本階段主要工作如下:
1、根據不同專案程序id自動生成映象檔案
2、常見場景如新老代記憶體使用率100%時,自動生成映象檔案
3、學習並嘗試引進一種工具或者指令碼實時監控系統主要效能引數如:cpu、記憶體、磁碟IO、頻寬等。
第三階段
mat工具及效能調優組內分享,並在使用中優化完善指令碼。
主要內容:
1、輸出調優分享及mat搭建文件
2、對使用過程提出的建議進行優化指令碼
3、對引進監控效能主要引數最後確定
工 具 選 擇
本階段主要是選擇分析堆疊的工具,及初步嘗試使用工具定位堆疊映象中使用記憶體的情況;梳理出常用定位步驟;編寫或利用工具輔助監控記憶體的使用。
在工具選擇mat外掛(全稱Memory Analyzer),和市場上其他同類工具如jvisualvm(jdk1.7以上自帶)、jprofile等相比完勝對手。首先他是一個外掛相對jprofile而言更輕量,在分析打記憶體的堆疊來說效率更快;
和jvisualvm相比提供了諸如Leak Suspects的報告,更直接準確的將可能有問題的地方暴露出來分析更準確。
初 步 定 位 方 法
先簡單瞭解下jvm垃圾回收的過程。為構造jvm空間不足可適當調整jvm配置,參考:-Xms256M -Xmx512M -Xmn128M -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/logs 。
其中後面兩個引數是當記憶體報OutOfMemoryError ,會在/var/logs 路徑下生成一個dump檔案提供分析定位,也可手工主動生成dump檔案,方法如下:
現在將映象檔案匯入mat,它為我們提供了多個報告:
從上圖可以看到它的大部分功能,在餅圖上,你會發現轉儲的大小和數量的類,物件和類載入器。
正確的下面,餅圖給出了一個印象最大的物件轉儲。移動你的滑鼠一片看到物件中的物件的細節檢查在左邊。下面的Action標籤中:
Histogram可以列出記憶體中的物件,物件的個數以及大小。
Dominator Tree可以列出那個執行緒,以及執行緒下面的那些物件佔用的空間。
Top consumers通過圖形列出最大的object。
Leak Suspects通過MA自動分析洩漏的原因。
histogram
Shallow Heap :一個物件記憶體的消耗大小,不包含對其他物件的引用
Retained Heap :是shallow Heap的總和,也就是該物件被GC之後所能回收到記憶體的總和
一般來說,Shallow Heap堆中的物件是它的大小和保留記憶體大小相同的物件是堆記憶體的數量時,將釋放物件被垃圾收集。保留設定一組主要的物件,例如一個特定類的所有物件,或所有物件的一個特定的類裝入器裝入的類或者
只是一群任意物件,是釋放的組物件如果所有物件的主要設定變得難以接近的。保留設定包括這些物件以及所有其他物件只能通過這些物件。保留大小是總堆大小中包含的所有物件的保留。可使用工具提供的regex正則搜
索一下自己的類,排序後看看哪些相對是佔用比較大的。
dominetor_tree
可以看出來beans佔用比較多記憶體。
Top_consumers_html
可以看出來那些包引用哪些類佔用較多記憶體。
Leak_Suspects
自動分析最可能出現記憶體問題的類是:java.beans.ThreadGroupContext,由類載入器:<system class loader>,載入例項:java.util.WeakHashMap$Entry,佔用8,643,712 (11.69%)位元組。
當然在分析過程中最好過濾掉弱引用分析更準確。
輔 助 腳 本
當記憶體使用出現緊張的時候就需要考慮分析原因了,為監控記憶體使用情況,寫了一個小指令碼,實時的列印記憶體剩餘情況,執行如下(省略):
同時也可利用jvm回收原理,利用jdk自帶工具監控,當兩個存活區不存在一個為空閒的時候說明記憶體是不夠的,此時可分析堆疊資訊,如下所示(s1和s0都不為0.00):
其他工具,如:nmon檔案。這個檔案可實時監控虛擬機器cpu、記憶體、磁碟等使用情況,命令列監控生成檔案,匯入nmon分析工具即可。監控過程略。
總 結
結合指令碼及其他工具分析判斷記憶體洩露或者記憶體溢位,進行分析可能存在記憶體問題的類或者物件或者對jvm空間配置進行調整。本次確定了監控的主要步驟分析工具如下:
1、利用指令碼、工具監控記憶體使用情況
2、對記憶體報錯outofmemory或者記憶體1飆升存在可能風險的點保留dump映象
3、匯入mat工具分析定位最可能有問題的物件
安裝:環境JDK1.8+eclipse4.5+mat外掛(也可使用mat單獨執行軟體壓縮包如下)
安裝過程參考:https://yq.aliyun.com/ziliao/422140