在最近的工作中,通過JProfiler解決了一個內存泄漏的問題,現將檢測的步驟和一些分析記錄下來,已備今后遇到相似問題時可以作為參考。
運行環境:
內存泄漏的現象:
使用JProfiler檢查內存泄漏的步驟:
1. 初始化檢驗環境:
切換到“Live Memory-->All Objects”標簽,可以看到當前tomcat中的對象情況,注意jprofiler其他版本可能位置不一樣.
在執行操作前,需要先F4,運行“Run GC”,使jvm進行內存回收清理無效的對象.為了便於比較內存的增長情況,可以點擊右鍵--->"Mark Current",
來將當前內存使用情況作為參照;點擊后會顯示“Difference”列,該列會列出對象數量的變化和變化比率
2.打開內存記錄:
點擊“Start Recordings”按鈕,開始記錄。執行這步的主要目的是為下面“Heap Walker”設置一個監控區間;如果不記錄的話“Heap Walker”將分析jvm虛擬機的所有內存,即耗時又不能准確的發現內存泄漏的原因。
3. 執行操作,執行gc;
4. 關閉內存記錄:
5. 找到增加迅速的對象類型,打開HeapWalker:
在視圖中找到增長快速的對象類型,本例Concurrenthashmap的增長速度很快。在memory視圖中找到Concurrenthashmap---點右鍵----選擇“Show Selectiion In Heap Walker”,切換到HeapWarker 視圖;切換前會彈出選項頁面,注意一定要選擇“Select recorded objects”,這樣Heap Walker會在剛剛的那段記錄中進行分析;否則,會分析tomcat的所有內存對象,這樣既耗時又不准確;
6. 在HeapWalker中,找到泄漏的對象;


通過切換到References頁簽,可以看到這個類的具體對象實例。
為了在這些內存對象中,找到泄漏的對象(應該被回收),可以在該對象上點擊右鍵,選擇“Use Selected Instances”縮小對象范圍;
單擊OK按鈕
7. 通過引用分析該對象:
incoming 表示顯示這個對象被誰引用;
outcoming 表示顯示這個對象引用的其他對象;


8. 通過創建分析該對象:
