Android客户端性能测试—内存(一)
来源:互联网 发布:python 合并xml文件 编辑:程序博客网 时间:2024/06/16 10:14
前言:
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再用字符串截取方式获取内存,可对其数据进行返回打印,实现监控。
传入参数为:应用包名,这个不可变。
package com.hss.performanceTest;/** * from hss * data:2017/9/8 * project:getMemory */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class getMemory { public static String GetMemory(String packageName) throws IOException, InterruptedException { String str3=null; Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName); try { if (proc.waitFor() != 0) { System.err.println("exit value = " + proc.exitValue()); } BufferedReader in = new BufferedReader(new InputStreamReader( proc.getInputStream())); StringBuffer stringBuffer = new StringBuffer(); String line = null; while ((line = in.readLine()) != null) { stringBuffer.append(line+" "); } String str1=stringBuffer.toString(); String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects")); str3=str2.substring(0,10); str3.trim(); } catch (InterruptedException e) { System.err.println(e); }finally{ try { proc.destroy(); } catch (Exception e2) { } } return str3 ; } public static void main(String args[]) { System.out.println("开始运行..."); try {String resurt = getMemory.GetMemory("com.hundsun.stockwinner.sxzq");System.out.println("山西证券的内存:"+resurt);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }
运行截图:
- Android客户端性能测试—内存(一)
- android客户端性能测试 (一)
- android客户端性能测试 (一)
- 测试-客户端性能测试(一)
- android客户端性能测试
- android客户端性能测试
- android客户端性能测试
- Android客户端性能测试—CPU、启动时间(二)
- Android客户端性能测试—流量(三)
- Android客户端性能测试(一):使用APT测试Android应用性能
- Android客户端性能测试(一):使用APT测试Android应用性能
- android性能测试-内存
- android客户端性能测试工具
- Android应用性能测试(CPU跟内存的性能)
- android性能优化(一)内存优化
- Android 性能优化(一)内存篇
- Android性能测试-内存篇
- Android 性能测试实践(一)
- UML使用2
- IplImage和cv::Mat间的转换
- Redis 宝典 | 基础、高级特性与性能调优
- Spring Boot
- MVC与WebForm的区别
- Android客户端性能测试—内存(一)
- 前端零基础入门(一):从历史理解web前端
- HelloWorld
- 2017-09-08 LeetCode_006 ZigZag Conversion
- zuul网关Filter处理流程及异常处理
- 杭城上演阿里巴巴“春运”大片……
- SpringMVC @RequestBody接收Json对象字符串
- 以str开头的字符串处理函数总结
- 强烈推荐:程序员接私活那点事