我們可以使用**生成
hprof
,然後使用批處理hprof檔案,然後用mat進行對多個
hprof檔案
比較分析。
一、批處理配置檔案
批處理配置檔案config.bat如下:
rem the following var is for getprocessstate.bat
set rawdatadir=rawdata
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:\sdk\froyo\android-sdk-dempsey-i997\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:outroot為對程序的rss進行統計最後的生成檔案的字首。
注6:tools為hprof-conv.exe所在的目錄。
注7:hpinputfiledir為手機中我們生成的hprof檔案所在的目錄。
注8:hpinputfiledir為
手機中我們生成的
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()
catch (ioexception e) }
四,在電腦上通過批處理取轉換hprof 檔案
如果在程式中用
debug.dumphprofdata("/sdcard/input.hprof")
的方式生成了
hprof檔案
, 那麼就可以執行檔案gethprof .bat來取得
hprof並轉化為memoryanalyzer的格式。
gethprof.bat檔案如下:
@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中。
getsubstr
》,《genserial》
關於更多的android記憶體洩露利器請閱讀《
android記憶體洩露利器(rss記憶體統計篇)
》,《android記憶體洩露利器(記憶體統計篇)
》, 《
android記憶體洩露利器(全自動篇)》
Android記憶體洩露利器(RSS記憶體統計篇)
前言 rss resident set size 表示實際使用物理記憶體 包含共享庫占用的記憶體 因為它包含了共享記憶體,所以他的意義不及pss。所以現在檢視記憶體使用情況一般參照pss。因此現在一般不使用getprocessstate.bat,而是使用getmemorystate.bat andr...
Android記憶體洩露
android應用記憶體洩漏的的原因有以下幾個 1查詢資料庫後沒有關閉游標cursor 2 構造adapter時,沒有使用 convertview 重用 3 bitmap物件不在使用時呼叫recycle 釋放記憶體 4 物件被生命週期長的物件引用,如activity被靜態集合引用導致activity...
android 記憶體洩露
記憶體洩露情況 1 使用單例導致記憶體洩露 public class singleton public static singleton getsingleton context context return singleton 原因 靜態的單例使它的生命週期與應用的生命週期一樣長,context一...