原文地址:http://www.javashuo.com/article/p-gtzuxzek-hq.htmlhtml
在最近的工做中,經過JProfiler解決了一個內存泄漏的問題,現將檢測的步驟和一些分析記錄下來,已備從此遇到類似問題時能夠做爲參考。tomcat
運行環境:
內存泄漏的現象:
使用JProfiler檢查內存泄漏的步驟:
1. 初始化檢驗環境:
切換到「Live Memory-->All Objects」標籤,能夠看到當前tomcat中的對象狀況,注意jprofiler其餘版本可能位置不同.服務器
在執行操做前,須要先F4,運行「Run GC」,使jvm進行內存回收清理無效的對象.爲了便於比較內存的增加狀況,能夠點擊右鍵--->"Mark Current",jvm
來將當前內存使用狀況做爲參照;點擊後會顯示「Difference」列,該列會列出對象數量的變化和變化比率工具
2.打開內存記錄:
點擊「Start Recordings」按鈕,開始記錄。執行這步的主要目的是爲下面「Heap Walker」設置一個監控區間;若是不記錄的話「Heap Walker」將分析jvm虛擬機的全部內存,即耗時又不能準確的發現內存泄漏的緣由。spa
3. 執行操做,執行gc;
4. 關閉內存記錄:
5. 找到增長迅速的對象類型,打開HeapWalker:
在視圖中找到增加快速的對象類型,本例Concurrenthashmap的增加速度很快。在memory視圖中找到Concurrenthashmap---點右鍵----選擇「Show Selectiion In Heap Walker」,切換到HeapWarker 視圖;切換前會彈出選項頁面,注意必定要選擇「Select recorded objects」,這樣Heap Walker會在剛剛的那段記錄中進行分析;不然,會分析tomcat的全部內存對象,這樣既耗時又不許確;htm
6. 在HeapWalker中,找到泄漏的對象;
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
經過切換到References頁籤,能夠看到這個類的具體對象實例。對象
爲了在這些內存對象中,找到泄漏的對象(應該被回收),能夠在該對象上點擊右鍵,選擇「Use Selected Instances」縮小對象範圍;blog
單擊OK按鈕內存
7. 經過引用分析該對象:
incoming 表示顯示這個對象被誰引用;
outcoming 表示顯示這個對象引用的其餘對象;
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
8. 經過建立分析該對象:
![](http://static.javashuo.com/static/loading.gif)