生成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文件所在的目錄。
注8:
hpInputFile為
手機中我們生成的
hprof文件的名字。
二,需要使用的bat庫
子目錄lib用於存放bat庫
需要的bat庫:
genSerial.bat
,
getSubStr.bat
。
三,在代碼中生成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文件的路徑一致。
注意3
:需要把bat庫genSerial.bat,getSubStr.bat放在子目錄lib中。