java程式也會引起記憶體泄露已經是公開的秘密了,工作中需要對該問題引起充分的重視。
市場上能夠進行java記憶體檢測的工具也有不少,我在工作中使用JBuilder內建的Optimize工具,現就最近一次使用Optimize的工程及經驗進行以下梳理。
前一段時間根據需要,對工作中維護的某個模組進行了java記憶體泄露的測試,結果發現了很嚴重的問題:該模組一共有6大準系統,每個功能每操作一次,大約要新消耗9-10k的記憶體空間,產生110個左右的新對象。作為商用軟體產品是絕不允許這樣的問題的出現的。
OptimizeIT有整合進JBuilder版本,也有單獨的版本,使用起來基本上都是一樣的,它有4大功能,能夠進行記憶體profile,cpu的profile,代碼的覆蓋率的檢查,以及threads debug等,能夠對普通應用程式,jsp/servlet,以及伺服器請求等進行剖析。其它的沒有用過,這次主要使用記憶體profile,發現這個這個咚咚比較好用。(其實,borland出品的工具比較很好用的,但是borland IDE目前的處境真是讓人揪心啊)
下面介紹怎樣使用OptimizeIT工具進行記憶體泄露的檢測和解決。
先說檢測的思路:程式運行從一種狀態進經過運行返回到初始狀態,中間過程會產生很多的對象,而這些中間產物最終是應該被清除掉,如果沒有被完全清除,就說明程式中有了記憶體泄露。換句話說,通過比較程式運行前後兩種狀態下堆記憶體中的對象的種類和數量的多少,可以判斷出程式中有沒有產生記憶體泄露。當終了時刻程式堆記憶體裡面對象的種類和數量,比初始時刻多,基本就可以確定程式中存在記憶體泄露了。
接著說這次使用OptimizeIT檢測的過程。
1.首先使用JBuilder建立一個可啟動並執行工程,再進行工程運行屬性的配置的時候可以同時進行OptimizeIT的配置,主要是選擇記憶體泄露選項(以及其它的可選項,不過很少用)。
2.點擊工具列上的Optimize按鈕開始檢測,該按鈕位於程式運行按鈕的右邊,帶有一個秒錶的樣式。
3.Optimize啟動之後會展示幾個Tab頁視圖,我們主要關心記憶體視圖。
4.預設的在記憶體視圖中顯示的是堆記憶體視圖,通過在該試圖下方輸入過濾條件,在該視圖的中部,可以得到我們關心的類的對象執行個體情況。
5.運行程式到某一個初始狀態。
6.回到Opimize,運行記憶體回收行程,為了儘可能調動GC,建議連續運行GC三次以上(簡單的說就是多點擊記下按鈕而已)。
7.對當天的狀態進行標記,也就是點擊一下視圖右上方的帶鉛筆樣式的表徵圖。
8.行程式的功能,然後關閉該功能,使程式的退回到原來的狀態,基本上就是在Optimize上作標記時刻的介面樣子。
9.Optimize堆記憶體視圖,多次進行GC。
10.timize報告出從最近一次做標記以來記憶體對象(執行個體)的變化情況。由於我們已經進行過濾,所以imize不會顯示我們關心的包(或者類)以外的對象的情況。
通過這種比較,我們可以發現程式中是否有記憶體泄露。