代码改变世界

3、获取APP 内存占用率

2018-08-01 10:59  软件测试汪  阅读(1814)  评论(0编辑  收藏  举报

关于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 

 

参数解释:

 

第一组数据的含义:

  1.  User 处于用户态的运行时间,不包含优先值为负进程
     Nice 优先值为负的进程所占用的CPU时间
     Sys 处于核心态的运行时间
     Idle 除IO等待时间以外的其它等待时间
     IOW IO等待时间
     IRQ 硬中断时间
     SIRQ 软中断时间

     

第二组数据的含义:

  1.  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()

 

运行结果展示: