生成hprof文件,用MAT進行分析


生成hprof文件可以在DDMS選中進程點擊窗口左上角的"dump hprof file"按鈕來直接生成,也可以通過在程序加代碼中來生成

代碼2

    void generateHprof()

    {

            String packageName=getApplicationInfo().packageName;

            String hpFilePath="/data/data/"+packageName+"/input.hprof";

            try {

                  //Debug.dumpHprofData("/sdcard/input.hprof");

                  Debug.dumpHprofData(hpFilePath);

            } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

            }

    }

 

建議使用代碼生成hprof,然后使用批處理hprof文件,然后用Memory Analyzer tool(MAT)進行對多個hprof文件比較分析。

 

MAT導入.hprof文件以后,MAT會自動解析並生成報告,點擊Dominator Tree,並按Package分組,選擇自己所定義的Package類,比較各個類在不同時期的Retained Heap,找出可疑類,然后選擇該類,點右鍵,選中show retained Set 項,參看Retained Heap的詳細信息,進一步找出嫌疑項。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、批處理配置文件

批處理配置文件config.bat如下:
rem the following var is for getProcessState.bat
set rawDatadir=rawData
set processName=android.process.acore;com.android.systemui
rem set processShortName=a;b;c
set processShortName=
set outRoot=out
set statFilePrefix=stat
rem the following var is for getHprof.bat
set tools=D:\android\tools
set hpInputFileDir=/sdcard
set hpInputFile=input.hprof
set hpRoot=hpTemp
注1:rawDatadir為“ps -x”提取出來的文件的目錄
注2:processName需要統計RSS的進程的名字,可以同時統計多個,進程名之間用“;”進行分割。
注3:processShortName需要統計RSS的進程的名字的縮寫形式,如果不坐設置或設置為空,這程序會根據processName自動生成。
注4:outRoot為對進程的RSS進行統計最后的生成文件的存放目錄。
注5:statFilePrefix為對進程的RSS進行統計最后的生成文件的前綴。
注6:tools為hprof-conv.exe所在的目錄。
注7:hpInputFileDir為手機中我們生成的hprof文件所在的目錄。
注8hpInputFile為 手機中我們生成的 hprof文件的名字。
二,需要使用的bat庫
子目錄lib用於存放bat庫
需要的bat庫: genSerial.bat getSubStr.bat
關於 genSerial.bat 請參看《 genSerial
關於 getSubStr.bat 請參看《 getSubStr
三,在代碼中生成Hprof文件:
在android代碼,可以使用如下代碼把hprof文件生成到sd卡上。
Debug.dumpHprofData("/sdcard/input.hprof");
可以不用sd卡,而將hprof文件直接生成在手機上,但是只能在"/data/data/"+packageName的目錄下。
實例1
    void generateHprof()
    {
String packageName=getApplicationInfo().packageName;
String hpFilePath="/data/data/"+packageName+"/input.hprof";
try {
//Debug.dumpHprofData("/sdcard/input.hprof");
Debug.dumpHprofData(hpFilePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
 
四,在電腦上通過批處理取轉換Hprof 文件
如果在程序中用 Debug.dumpHprofData("/sdcard/input.hprof") 的方式生成了 hprof文件
那么就可以執行文件getHprof .bat來取得 Hprof並轉化為MemoryAnalyzer的格式。
getHprof.ba t文件如下:
@echo off
call config.bat
if exist %hpInputFile% (
del %hpInputFile% /q
)
adb pull %hpInputFileDir%/%hpInputFile% .
if not exist %hpInputFile% (
echo fail to pull %hpInputFile%
exit 1
)
if not exist %hpRoot% (
md %hpRoot%
)
Setlocal enabledelayedexpansion
set path=%path%;%cd%\lib
call genSerial
set serial=!genSerial~result!
set hpOutFile=%serial%.hprof
%tools%\hprof-conv.exe %hpInputFile% %hpRoot%\%hpOutFile%
echo success!
endlocal
注1需要在代碼中先生成 hprof文件 ,而且config.bat中配置的路徑要和 在代碼中先生成 hprof文件的路徑一致。
注2 如果需要連續多次以固定的時間提取 hprof文件 ,請參照《 Android內存泄露利器(全自動篇)
注意3 :需要把bat庫genSerial.bat,getSubStr.bat放在子目錄lib中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM