今天发现了一篇很好的帖子,特此分享一下,
原文出处:http://www.cnblogs.com/chengchengla1990/archive/2016/10/21/5984084.html,感谢作者子信风蓝蓝的精彩分享。
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/lib/libpagemap.so
如果 push 不进三个文件或者修改不了三个文件的权限,那重新挂载一下 system,再修改三个文件的权限,如下:
mount -o remount,rw /system
procrank 各项值解析
进入 adb shell,获取 root 权限,输入命令:procrank 即可,如下图:
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
VSS 和 USS 对查看某一进程自身的内存状况没什么作用,因为他们包含了共享库的内存使用,而往往共享库的资源占用比重是很大的,这样就稀释了对 Process 自身创建内存波动。
我们一般观察 Uss 来反映一个进程的内存使用情况,Uss 的大小代表了只属于本进程正在使用的内存大小,这些内存在此进程被杀掉之后,会被完整的回收掉。
USS 是一个非常有用的数字,因为它揭示了运行一个特定进程的真实的内存增量大小,如果进程被终止,USS 就是实际被返还给系统的内存大小。USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。
怀疑某个程序有内存泄露可以查看 USS 值是否一直有增加。
1)首先创建一个 cmd.txt 文件,写入需要执行的 adb shell 命令,如:
2)写 python 脚本,如下:
import os,sys,time
for 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)分析 USS 的值,查看是否有内存泄露。