首页 > 代码库 > android应用内存占用测试(每隔一秒打印procrank的信息)
android应用内存占用测试(每隔一秒打印procrank的信息)
1.内存占用
对于智能手机而言,内存大小是固定的;因此,如果单个app的内存占用越小,手机上可以安装运行的app就越多;或者说app的内存占用越小,在手机上运行就会越流畅。所以说,内存占用的大小,也是考量app性能的一个重要指标
2.原理说明
对于一个app,我们可以关注它在3种状态下的内存占用情况:
空负荷————app已经在后台运行,但是用户没有使用;
中负荷————app在前台运行,用户进行了少量操作;
满负荷————用户持续频繁大量操作,app接近饱和状态运行。
然而,除了第一种情况,其它两种的主观性很强,不是很容易区分。正常产品测试的时候,只要验证后台运行(5~10分钟为宜)和用户持续频繁大量操作(10~15分钟为宜)这两种情况下就可以了。
这样一来,就变成了如何持续统计并记录app所占内存的问题。Procrank工具可以实现这个功能。
3.procrank的安装
1)下载procrank压缩包,下载地址:http://download.csdn.net/download/yincheng886337/9433538
2)解压,将procrank文件push到手机的 /system/xbin目录下;
命令:adb push procrank /system/xbin
将procmem文件push到手机的 /system/xbin目录下;
命令:adb push procmem /system/xbin
将libpagemap.so文件push到手机的 /system/lib目录下;
命令:adb push libpagemap.so /system/lib
3)进入adb shell,获取root权限,分别给procrank、procmem、libpagemap.so三个文件777权限,如下:
chmod 777 /system/xbin/procrank
chmod 777 /system/xbin/procmem
chmod 777 /system/xbin/libpagemap.so
如果push不进三个文件或者修改不了三个文件的权限,那重新挂载一下system,再修改三个文件的权限,如下:
mount -o remount,rw /system
4. procrank各项值解析
进入adb shell,获取root权限,输入命令:procrank即可,如下图:
VSS——是单个进程全部可访问的地址空间,其大小包括可能还尚未在内存中驻留的部分。比如地址空间已经被 malloc 分配,但是还没有实际写入;对于确定单个进程实际内存使用大小, VSS 用处不大。
RSS——是单个进程实际占用的内存大小,RSS 易被误导的原因在于, 它包括了该进程所使用的所有共享库的全部内存大小。对于单个共享库,尽管无论多少个进程使用,实际该共享库只会被装入内存一次;因此,对于单个进程的内存使用大小, RSS也不是一个精确的描述。
PSS——不同于RSS的是,PSS按比例包含了其所使用的共享库大小;例如,三个进程使用同一个占用30内存页的共享库。对于三个进程中的任何一个,PSS将只包括其中的10个内存页。PSS是一个非常有用的数字,因为系统中全部进程以整体的方式被统计,对于系统中的整体内存使用是一个很好的描述。如果一个进程被终止,其PSS中所使用的共享库大小将会重新按比例分配给剩下的并且仍在使用该共享库的进程。
USS——是单个进程的全部私有内存大小,亦即全部被该进程独占的内存大小;
USS是一个非常非常有用的数字,因为它揭示了运行一个特定进程的真实的内存增量大小,如果进程被终止,USS就是实际被返还给系统的内存大小。USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。
5.写脚本每隔一秒自动打印procrank的信息
1)首先创建一个cmd.txt文件,写入需要执行的adb shell 命令,如:
2)写python脚本,如下:
import os,sys,timefor i in range(500): os.popen("adb shell <cmd.txt") #运行cmd.txt中的命令 step1=os.popen("adb pull /data/test/t1.txt F:/100python/log102101.txt") #把生成的t1.txt文件下载到本地 fo = open("log102101.txt", ‘r+‘) input = fo.read() fo2 = open("mem.txt", ‘r+‘) fo2.seek(0, os.SEEK_END) #定位到mem.txt文件尾部 fo2.write(input) #写入t1.txt的内容 fo.close() fo2.close() time.sleep(1) #休息一秒,再进入下一个循环,也就是每隔一秒打印一次procrank的信息print "ok" #运行完毕的标志
注:cmd.txt文件,python脚本,mem.txt都存放在同一目录下
3)运行monkey,同时执行写好的脚本
生成的mem.txt文件如下:
附monkey命令:
adb shell monkey -p com.waboon.test --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-touch 30 -v -v -v --throttle 200 1000
4)mem.txt文件中第五列的值是USS,将mem.txt文件用notepad打开,再选择第五列的值复制到excel中生成图表,如下:
5)分析值
android应用内存占用测试(每隔一秒打印procrank的信息)