关于APP内存占用,不用多说,应该是APP性能测试中比较重要的一点。试想一下,开个应用把手机内存占满了,其它应用无法打开,那么这个应用还会有人安装吗?我觉得是没有的。下面就通过adb命令获取APP虚存和实存数据。
top 用法
参数解释:
-m num Maximum number of processes to display. //最多显示多少个进程 -n num Updates to show before exiting. //刷新次数 -d num Seconds to wait between updates. //刷新间隔时间(默认5秒) -s col Column to sort by (cpu,vss,rss,thr). //按哪列排序 -t Show threads instead of processes. //显示线程信息而不是进程 -h Display this help screen. //显示帮助文档
Windows下获取APP 内存占用率
adb shell top
参数解释:
第一组数据的含义:
-
User 处于用户态的运行时间,不包含优先值为负进程 Nice 优先值为负的进程所占用的CPU时间 Sys 处于核心态的运行时间 Idle 除IO等待时间以外的其它等待时间 IOW IO等待时间 IRQ 硬中断时间 SIRQ 软中断时间
第二组数据的含义:
-
PID 进程id PR 优先级 CPU% 当前瞬时CPU占用率 S 进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程 #THR 程序当前所用的线程数 VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存) PCY 调度策略优先级,SP_BACKGROUND/SP_FOREGROUND Name 进程的名称
那么实际测试过程中,我们肯定要获取多次虚存和内存进行比对,所以我们可以把log保存到本地,并且设置多长时间记录一次。
adb shell top -d 20 > meminfo // 每20s记录一次,并把日志保存到meminfo里面
那么问题又来了。日志我们有了,但是里面的数据实在是太多了,我们不可能一个一个找,不然一天都找不玩,所以,我们依旧通过写脚本方式从日志里面获取我们想要的虚存和实存信息。
python脚本获取APP 虚存/实存
#/usr/bin/python #encoding:utf-8 import csv import os import time #控制类 class Controller(object): def __init__(self): #定义收集数据的数组 self.alldata = [("id", "vss", "rss")] #分析数据 def analyzedata(self): content = self.readfile() i = 0 for line in content: if "com.begoit.studyplan" in line: print line line = "#".join(line.split()) vss = line.split("#")[7].strip("K") rss = line.split("#")[8].strip("K") #将获取到的数据存到数组中 self.alldata.append((i, vss, rss)) i = i + 1 #数据的存储 def SaveDataToCSV(self): csvfile = file('meminfo.csv', 'wb') writer = csv.writer(csvfile) writer.writerows(self.alldata) csvfile.close() #读取数据文件 def readfile(self): mfile = file("meminfo", "r") content = mfile.readlines() mfile.close() return content if __name__ == "__main__": controller = Controller() controller.analyzedata() controller.SaveDataToCSV()
运行结果展示: