1. 程式人生 > >開發優化之——調優工具:dump hprof file 檢視記憶體情況,找到記憶體洩露,androidhprof

開發優化之——調優工具:dump hprof file 檢視記憶體情況,找到記憶體洩露,androidhprof



雖說知道一般性的開發android應用需要注意的問題,可是也有水平參差不齊的情況,特別是維護程式碼,如果記憶體佔用大,記憶體溢位嚴重,又怎麼解決呢?  --  通過DDMS把heap抓出來分析

1、開啟DDMS


2、選中需要檢視的程式,並且點選Update Heap圖示



3、檢視Heap情況



但是這僅僅是檢視一下Heap的使用情況,那如果發現記憶體佔用或者溢位很嚴重,動不動就OOM了。通過這個是看不出啥東西的,這個時候就需要把Heap抓出來分析,在UpdateHeap邊上還有一個按鈕。


點一下,會生成一個檔案,隨便儲存起來(會有點延時,耐心等等喔,我儲存到桌面)

7、檢視剛剛下載的檔案,不過要檢視之前我們需要 MAT



8、安裝MAT ,步驟基本上網上都有,方法為:eclipse-》help-》Eclipse Marketplace-》選擇Memory Analysis 右邊的install 然後下一步 下一步安裝即可。

9、.hprof檔案轉換,由DDMS直接儲存的檔案不能用MAT檢視,會提示格式不正確。這個時候要使用sdk帶的工具 hprof-conv來進行轉換。

C:\Users\Administrator>hprof-conv C:\Users\Administrator\Desktop\test.hprof C:\Users\Administrator\Desktop\hprofed-test.phrof

10、使用MAT開啟.hprof檔案檢視記憶體使用情況。

至於MAT怎麼用 百度或者谷歌還是很多的,或者等我研究到對android有價值的東西,我會再開一個博文說明的!


使用android MAT檢視記憶體洩露問題,我查看了很多資料,為何在DDMS中沒有hprof檔案?

如何用MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse:
1.開啟Eclipse
2.選擇 Help->Install New Software;
3.在Work with中新增站點:download.eclipse.org/mat/1.0/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到: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,會進一步篩選出跟程式相關的所有有記憶體洩露的類。據此,可以追蹤到程式碼中的某一個產生洩露的類。
 

Android中怎查詢記憶體洩露

1、首先確定是否有記憶體洩露及哪個程式造成。
1.1、記憶體洩露已彈出out of memory對話方塊的情況。
這種情況很簡單,直接看對話方塊就知道是哪個應用的問題了。然後再分析該應用是否是因為記憶體洩露造成的
out of memory對話方塊。
》中介紹的各種方法進行分析,確定是否有記憶體洩露以及是哪個程序造成的記憶體洩露。
2、生成hprof檔案,用MAT進行分析。
生成hprof檔案可以在DDMS選中程序點選視窗左上角的dump hprof file按鈕來直接生成,也可以通過在程式加程式碼中來生成程式碼2:voidgenerateHprof(){String packageName=getApplicationInfo().packageName;
StringhpFilePath=/data/data/+packageName+/input.hprof;try{//Debug.dumpHprofData(/sdcard/input.hprof);Debug.
dumpHprofData
(hpFilePath);}catch(IOException e) {//TODOAuto-generated catch block
e.printStackTrace();}}建議使用程式碼生成hprof,然後使用《
Android記憶體洩露利器(hprof篇)》中的工具自動提取多個hprof檔案,然後用MAT進行比較分析。在MAT匯入.hprof檔案以後,
MAT會自動解析並生成報告,點選
Dominator Tree
,並按Package分組,選擇自己所定義的Package類,比較各個類在不同時期的RetainedHeap
,找出可疑類,然後選擇該類,點右鍵,選中
show retained Set項,參看Retained Heap
的詳細資訊,進一步找出嫌疑項。
3、在程式碼中查詢記憶體洩露。
根據在MAT找到的記憶體洩露資訊,參照《
Android記憶體洩漏簡介
》進一步在記憶體中查詢記憶體洩露的原因並解決。
另外如果程式碼很簡單,可以直接參照《
Android記憶體洩漏簡介
》在記憶體中查詢記憶體洩露的原因並解決。