1. 程式人生 > >hprof檔案開啟和轉換方式

hprof檔案開啟和轉換方式

與C++的記憶體不同,C++的記憶體洩露是由於分配了記憶體給某程式但是又沒有回收造成的。Java的記憶體洩露則是引用了一些垃圾物件,意思就是說程式引用了某些物件,但是又從來沒有使用過。
Jave中的引用分為3種:
強引用:引用為空的時候,Java的垃圾回收器會處理。一般來說自己寫的程式大部分都是強引用。
軟引用:堆記憶體不夠的時候,Java的垃圾回收器會處理這類引用。
弱引用:Jave的垃圾回收器每次都會回收這類引用。
如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse:
1.開啟Eclipse
2.選擇 Help->Install New Software;
3.在Work with中新增站點:
http://download.eclipse.org/mat/1.0/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到:http://www.eclipse.org/mat/downloads.php
4.生成.hprof檔案:插入SD卡(Android機器很多程式都需要插入SD卡),並將裝置連線到PC,在Eclipse中的DDMS中選擇要測試的程序,然後點選Update Heap 和Dump HPROF file兩個Button。
.hprof 檔案會自動儲存在SD卡上,把 .hprof 檔案拷貝到PC上的\ android-sdk-windows\tools目錄下。這個由DDMS生成的檔案不能直接在MAT開啟,需要轉換。

執行cmd開啟命令列,cd到\ android-sdk-windows\tools所在目錄,並輸入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof為原始檔案,yyyyy.hprof為轉換過後的檔案。轉換過後的檔案自動放在android-sdk-windows\tools 目錄下。
OK,到此為止,.hprof檔案處理完畢,可以用來分析記憶體洩露情況了。
5.開啟MAT:
在Eclipse中點選Windows->Open Perspective->Other->Memory Analysis
6.匯入.hprof檔案
在MAT中點選 File->Open File,瀏覽到剛剛轉換而得到的.hprof檔案,並Cancel掉自動生成報告,點選Dominator Tree,並按Package分組,選擇自己所定義的Package 類點右鍵,在彈出選單中選擇List objects->With incoming references。

這時會列出所有可疑類,右鍵點選某一項,並選擇Path to GC Roots->exclude weak/soft references,會進一步篩選出跟程式相關的所有有記憶體洩露的類。據此,可以追蹤到程式碼中的某一個產生洩露的類。