Android客户端性能测试—内存(一)

转载地址:https://blog.csdn.net/heshushun/article/details/77893817

前言:

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 C7R6T16722004661 shell  (若只有一台设备,可直接 adb shell ,多台必须加设备序列号C7R6T16722004661)

 

(4).查找进程:输入ps (模糊查找)    寻找对应待测应用包名,并记录下其的pid(进程ID):30017

若知道明确的包名,可直接准确查找 ps |grep com.hundsun.stockwinner.grzq

 

(5).查询内存信息:

可通过两种方式获取:

a.通过 “ dumpsys meminfo  包名/pid ” 命令获取,输入:dumpsys meminfo 30017

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. }

  61.  


运行截图:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值