關於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()
運行結果展示: