android手機測試中如何查看內存泄露

(一) 生成.hprof文件
生成.hprof 文件的方法有不少,並且Android 的不一樣版本中生成.hprof 的方式也稍有差異,我使用的版本的是2.1,各個版本中生成.prof 文件的方法請參考: http://android.git.kernel.org/?p=platform/dalvik.git;a=blob_plain;f=docs/heapprofiling.html;hb=HEAD。
 1. 打開eclipse 並切換到DDMS 透視圖,同時確認Devices、Heap 和logcat 視圖已經打開了;
2. 將手機設備連接到電腦,並確保使用「USB 調試」模式連接,而不是「Mass Storage「模式;
 3. 連接成功後在Devices 視圖中就會看到設備的序列號,和設備中正在運行的部分進程;
4. 點擊選中想要分析的應用的進程,在Devices 視圖上方的一行圖標按鈕中,同時選中「Update Heap」和「Dump HPROF file」兩個按鈕;
 5. 這是DDMS 工具將會自動生成當前選中進程的.hprof 文件,並將其進行轉換後存放在sdcard 當中,若是你已經安裝了MAT 插件,那麼此時MAT 將會自動被啓用,並開始對.hprof 文件進行分析;
 注意:第4 步和第5 步可以正常使用前提是咱們須要有sdcard,而且當前進程有向sdcard中寫入的權限(WRITE_EXTERNAL_STORAGE),不然.hprof 文件不會被生成,
在logcat 中會顯示諸如 ERROR/dalvikvm(8574): hprof: can't open /sdcard/com.xxx.hprof-hptemp: Permission denied.的信息。
若是咱們沒有sdcard,或者當前進程沒有向sdcard 寫入的權限(如system_process), 那咱們能夠這樣作:
6. 在當前程序中,例如framework 中某些代碼中,可使用android.os.Debug 中的: public static void dumpHprofData(String fileName) throws IOException 方法,手動的指定.hprof 文件的生成位置。
例如: xxxButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { android.os.Debug.dumpHprofData("/data/temp/myapp.hprof"); ... ... } }
上述代碼意圖是但願在xxxButton 被點擊的時候開始抓取內存使用信息,並保存在咱們指定的位置:/data/temp/myapp.hprof,這樣就沒有權限的限制了,並且也無須用sdcard。
但要保證/data/temp 目錄是存在的。這個路徑能夠本身定義,固然也能夠寫成sdcard 當中的某個路徑。

(二) 使用MAT導入.hprof文件
1. 若是是eclipse 自動生成的.hprof 文件,可使用MAT 插件直接打開(多是比較新的ADT才支持);
 2. 若是eclipse 自動生成的.hprof 文件不能被MAT 直接打開, 或者是使用android.os.Debug.dumpHprofData()方法手動生成的.hprof 文件,則須要將.hprof 文件進行轉換,轉換的方法: 例如我將.hprof 文件拷貝到PC 上的/ANDROID_SDK/tools 目錄下,並輸入命令hprofconv xxx.hprof yyy.hprof,其中xxx.hprof 爲原始文件,yyy.hprof 爲轉換事後的文件。轉換事後的文件自動放在/ANDROID_SDK/tools 目錄下。OK,到此爲止,.hprof 文件處理完畢,能夠用來分析內存泄露狀況了。
3. 在Eclipse 中點擊Windows->Open Perspective->Other->Memory Analyzer,或者打Memory Analyzer Tool 的RCP。在MAT 中點擊File->Open File,瀏覽並導入剛剛轉換而獲得的.hprof文件。

 (三) 使用MAT的視圖工具分析內存
導入.hprof 文件之後,MAT 會自動解析並生成報告,點擊Dominator Tree,並按Package分組,選擇本身所定義的Package 類點右鍵,在彈出菜單中選擇List objects->With incoming references。這時會列出全部可疑類,右鍵點擊某一項,並選擇Path to GC Roots -> exclude weak/soft references,會進一步篩選出跟程序相關的全部有內存泄露的類。據此,能夠追蹤到代碼中的某一個產生泄露的類。
MAT 的界面以下圖所示。

具體的分析方法在此不作說明了,由於在MAT 的官方網站和客戶端的幫助文檔中有十分詳盡的介紹。 瞭解MAT 中各個視圖的做用很重要,例如www.eclipse.org/mat/about/screenshots.php 中介紹的。
總之使用MAT 分析內存查找內存泄漏的根本思路,就是找到哪一個類的對象的引用沒有被釋放,找到沒有被釋放的緣由,也就能夠很容易定位代碼中的哪些片斷的邏輯有問題了。

另外在測試過程首先須要分析怎麼樣操做一個應用會產生內存泄露而後在不斷的操做中抓取該進程產生的hhprof文件使用MAT工具分析。目前本身的瞭解查看內存分析內存泄露還有如下幾種方法:

1.使用top命令查看某個進程的內存。例如建立一個腳本文件music.sh 該文件內容爲指定程序每隔一秒鐘輸出某個進程的內存使用狀況,在此具體實現以下 :
#!/bin/bash 
 while true; do
adb shell procrank | grep "com.android.music"
 sleep 1
 done

 而且配合使用procank工具能夠查看music進程每一秒鐘內存使用狀況。

2.另外使用top命令也但是查看內存具體爲:
adb shell top -m 10.(查看使用資源最多的10個進程)
adb shell top|grep com.android.music(查看music進程的內存)

3.free命令
free

1.做用free命令用來顯示內存的使用狀況,使用權限是全部用戶。
2.格式free [-b|-k|-m] [-o] [-s delay] [-t] [-V]
3.主要參數-b -k -m:分別以字節(KB、MB)爲單位顯示內存使用狀況。
-s delay:顯示每隔多少秒數來顯示一次內存使用狀況。
-t:顯示內存總和列。
-o:不顯示緩衝區調節列。
4.應用實例free命令是用來查看內存使用狀況的主要命令。和top命令相比,它的優勢是使用簡單,而且只佔用不多的系統資源。經過-S參數可使用free命令不間斷地監視有多少內存在使用,這樣能夠把它看成一個方便實時監控器。

#free -b -s5使用這個命令後終端會接二連三地報告內存使用狀況(以字節爲單位),每5秒更新一次。php

相關文章
相關標籤/搜索