主要是工作中發現后台項目有時候話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