Android記憶體洩露利器(hprof篇)

2021-08-26 12:46:02 字數 2669 閱讀 7854

我們可以使用**生成

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一...