本人网易博客原文:http://hubingforever.blog.163.com/blog/static/171040579201243071752744/
一、前言
MemoryLeakTool
是
Robin Hu
编写的一款用于监测Android进程内存使用情况的脚本工具,简称为
MLT
。
主要功能:
1、用于测试一个或多个进程是否有内存泄露。
2、用于自动提取一个Hprof文件,并转化为MAT所能识别的格式,以便分析。 该功能需要在你的程序的代码中先生成Hprof文件
Android2.3平台
当前版本:100
下载地址1
Android4.03平台
当前最新版本:101
下载地址1
历史版本:100
下载地址1(
Android4.03平台)
二、运行环境
运行平台:Window
依赖软件1:安装
JDK
,且将其bin目录加入到环境变量path中。
依赖软件2:安装
android-sdk4.0
,且将其platform-tools目录加入到环境变量path中。
三、配置参数
把
MLT
解压到你的电脑上,用记事本打开其中的
config.bat
文件进行参数配置。
批处理配置文件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:\SDK\android-sdk4.0\tools
set hpInputFileDir=/sdcard
set hpInputFile=input.hprof
set hpRoot=hpTemp
注1:rawDatadir为“ps -x”提取出来的文件的目录
注2:processName需要统计内存的进程名字,可以同时统计多个,进程名之间用“;”进行分割。
注3:processShortName需要统计RSS的进程的名字的缩写形式,如果不坐设置或设置为空,这程序会根据processName自动生成。
注4:outRoot为对进程的RSS进行统计最后的生成文件的存放目录。
注5:statFilePrefix为对进程的RSS进行统计最后的生成文件的前缀。
注6:tools为hprof-conv.exe所在的目录。
注7:hpInputFileDir为手机中我们生成的hprof文件所在的目录。
注8:hpInputFileDir为手机中我们生成的hprof文件的名字。
四、进程PSS内存统计
PSS
(Proportional Set Size)是指进程实际使用的物理内存(比例分配共享库占用的内存)。
PSS
指标对于研发人员来说比较有用,对于测试人员请使用
RSS
指标,关于如何统计进程RSS的请参考后文。
确保手机连接电脑,确保手机已经开启debug模式, 然后双击
runMemoryPicker.bat
弹出界面,
界面中的interval time表示的是好久提取一次进程的内存信息 点击按钮开始内存统计, 在手机上进行一些反复操作后, 如果你想查看这些操作是否造成了config.bat中指定的进程是否有内存泄露。 请打开MLT目录下的out目录,里面已经生成了一些关于进程的内存取样值文件。 比如:stat_Memory_android.process.acore.txt;stat_Memory_com.android.systemui.txt
打开stat_Memory_android.process.acore.txt文件你会看到一些数值序列:
NativeSize:13172,13172,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232,13232
DalvikSize:11015,11015,11143,11271,11335,11399,11527,11591,11655,11655,11655,11655,11655,11655,11655,11655,11655,11655,11655,11655
NativeAllocated:13158,13159,13202,13202,13202,13203,13203,13205,4711,4732,4783,4770,4773,4781,4768,4770,4770,4770,4922,4923
DalvikAllocated:10775,10859,11038,11122,11206,11290,11374,11482,9898,10029,10229,10310,10405,10554,10651,10731,10811,10892,10338,10419
NativePSS:5189,5189,5249,5249,5249,5249,5249,5249,3701,3705,3713,3713,3713,3713,3713,3713,3713,3713,3808,3808
DalvikPSS:2894,2982,3167,3255,3347,3431,3519,3631,3175,3187,3195,3199,3203,3223,3231,3239,3243,3251,3312,3312
TotalPSS
:20958,20993,21239,21326,21418,21502,21590,21702,9255,9276,9284,9288,9294,9317,9325,9333,9337,9345,9559,9559
我们首先需要关心的是
TotalPSS
,把TotalPSS里面的数值序列拷贝,用这些数值序列在excel中生成图表,
查看其函数曲线最后是否稳定,如果不稳定,就说明可能存在内存泄露。
另外,下次重新对某个进程经常内存统计请在out目录中请先将老的统计文件删除。
五、进程RSS内存统计
RSS
(Resident Set Size)表示的是进程实际使用物理内存大小(包含共享库占用的内存)
RSS
指标对于测试人员来说比较有用,对于研发人员最好使用PSS指标,关于如何统计进程PSS的请参考前文。
确保手机连接电脑,确保手机已经开启debug模式, 然后双击
runProcessStatePicker.bat
弹出界面,
界面中的interval time表示的是好久提取一次进程的内存信息
点击按钮开始内存统计, 在手机上进行一些反复操作后, 如果你想查看这些操作是否造成了config.bat中指定的进程是否有内存泄露。 请打开MLT目录下的out目录,里面已经生成了一些关于进程的内存取样值文件。
比如:
stat_android.process.acore.txt;stat_com.android.systemui.txt
打开stat_android.process.acore.txt文件你会看到一些数值序列:
RssSize
:56892,56892,56892,56892,56892,56892,56892,56892,56892,56892,56892,56924,56916,56916,56916,56916,56916,56916,56916,56916,56952,56980,56976,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56688,56692,56712,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56732,56736,56844,40400,40392,40392
把RssSize里面的数值序列拷贝,用这些数值序列在excel中生成图表,
查看其函数曲线最后是否稳定,如果不稳定,就说明可能存在内存泄露。
另外,下次重新对某个进程经常内存统计请在out目录中请先将老的统计文件删除。
六、提取hprof文件
关于此的详细内容请参考《
Android内存泄露利器(hprof篇)》