1. 程式人生 > >Android客戶端性能測試—內存【先碼】

Android客戶端性能測試—內存【先碼】

alt sid mem orm cts 部分 報錯 很好 indexof

前言:

1.該內容為APP應用客戶端的性能測試,未涉及後臺,所以並非針對API或數據接口

2.測試的目標項:資源消耗、內存泄露、電量功耗、響應時間

3.客戶端的性能指標:內存、CPU、流量

4.本系列主要是講述 如何獲取安卓APP應用的性能指標,並簡單分析,定位問題

一、查看 內存 指標:

準備工作:

(1).進入裝有測試APP手機的 “開發人員選項” 並打開“USB調試模式”

(2).使用數據線將手機設備與電腦設備連接,可裝PP助手進行接入

(3).手機打開待測APP,即打開進程

1.命令行查看內存數據:

(1).打開cmd

(2). 獲取設備列表:輸入 adb devices(預先安裝adb驅動、若報錯,拔掉重新連接手機)

技術分享圖片

(3).進入該設備的shell環境:輸入:adb -s 0815f8a3024a2605 shell (若只有一臺設備,可直接 adb shell ,多臺必須加設備序列號0815f8a3024a2605)

技術分享圖片

(4).查找進程:輸入ps (模糊查找) 尋找對應待測應用包名,並記錄下其的pid(進程ID):20852,

若知道明確的包名,可直接準確查找 ps |grep com.quncao.lark

技術分享圖片

(5).查詢內存信息:

可通過兩種方式獲取:

a.通過 “ dumpsys meminfo 包名/pid ” 命令獲取,輸入:dumpsys meminfo 20852

技術分享圖片

Pss Total :實際使用的物理內存

private dirty:私有駐留內存

Heap Size: 占用總內存(Heap 堆)(擴展:進程內存空間是虛擬內存,區分於物理內存,進程無法直接操作物理內存RAM。必要時,操作系統對其進行映射,使進程能應用到物理內存)

Heap Alloc: 分配內存

Heap Free: 空閑內存

native process和java process占據內存的大小(擴展:c++申請的內存為native process,java申請的內存:java process)

內存大小:native process:13004

dalvik process:10448

註:因為Android系統對dalvik的vm heapsize作了硬性限制,當java進程申請的java空間超過閾值時,就會拋出OOM異常(這個閾值可以是48M、24M、16M等,視機型而定)

查看單個應用最大內存限制,輸入命令:getprop|grep heapgrowthlimit 得到結果該機型為192M。dalvik process 超過就會拋OOM異常

技術分享圖片

b.可直接通過:procrank 。

手機中的sh是經過精簡過的,有些手機可能沒有 procrank 命令,可以使用genymotion模擬器,或是自己安裝procrank命令。

(我也沒這個命令,沒有裝好,這部分內容未操作,為網絡直接獲取)

技術分享圖片

VSS- Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)——是單個進程全部可訪問的地址空間

RSS- Resident Set Size 實際使用物理內存(包含共享庫占用的內存)——單個進程實際占用的內存大小,不是精確描述

PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)——對於系統中的整體內存使用是一個很好的描述

USS- Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)——單個進程的全部私有內存大小,亦即全部被該進程獨占的內存大小。

一般來說內存占用大小有如下規律:VSS >= RSS >= PSS >= USS。

USS 是針對某個進程開始有可疑內存泄露的情況,進行檢測的最佳數字

2.代碼獲取內存數據:

java調用Adb shell dumpsys meminfo再用字符串截取方式獲取內存,可對其數據進行返回打印,實現監控。

傳入參數為:應用包名,這個不可變。

 1 package com.hss.performanceTest;
 2 /**
 3  * from hss
 4  * data:2017/9/8
 5  * project:getMemory
 6  */
 7 import java.io.BufferedReader;
 8 import java.io.IOException;
 9 import java.io.InputStreamReader;
10  
11 public class getMemory {
12  
13     public static String GetMemory(String packageName) throws IOException, InterruptedException {
14  
15         String str3=null;
16           Runtime runtime = Runtime.getRuntime();
17           Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);
18           try {
19  
20               if (proc.waitFor() != 0) {
21                   System.err.println("exit value = " + proc.exitValue());
22               }
23               BufferedReader in = new BufferedReader(new InputStreamReader(
24                       proc.getInputStream()));
25               StringBuffer stringBuffer = new StringBuffer();
26               String line = null;
27               while ((line = in.readLine()) != null) {
28                   stringBuffer.append(line+" ");
29  
30               }
31               String str1=stringBuffer.toString();
32               String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));     
33               str3=str2.substring(0,10);
34               str3.trim();
35           } catch (InterruptedException e) {
36               System.err.println(e);
37           }finally{
38               try {
39                   proc.destroy();
40               } catch (Exception e2) {
41               }
42           }
43         return str3 ;
44     }
45     public static void main(String args[]) {
46         
47         System.out.println("開始運行...");
48         try {
49             String resurt = getMemory.GetMemory("com.hundsun.stockwinner.sxzq");
50             System.out.println("山西證券的內存:"+resurt);
51         } catch (IOException e) {
52             // TODO Auto-generated catch block
53             e.printStackTrace();
54         } catch (InterruptedException e) {
55             // TODO Auto-generated catch block
56             e.printStackTrace();
57         }             
58     } 
59     
60 }

運行截圖:

技術分享圖片

Android客戶端性能測試—內存【先碼】