性能测试之内存篇测试方法整理

背景

Android客户端性能测试部分,通常是指客户端的安卓应用层面的性能测试,这里的关注点为应用的性能测试。

应用的性能测试通常包括多种测试,如:内存,cpu,GPU,耗电量,流量,启动时间等等,对于应用的性能测试,如启动时间,内存,cpu等测试通常是通过使用外部提供的第三方工具来辅助测试,如腾讯的GT,安测试等工具,这些工具都是通过基于调用android底层的一些api来获取测试所用的值;当然,也可以使用android自身提供的一套adb指令完成上述测试。而GPU,耗电量,流量等测试,用第三方工具进行测试获得数据就不那么准确了,通过会利用硬件工具来完成相关测试,下面对Android客户端app的几种内存测试方式进行简单整理。

详情 ↓


 

性能测试之内存测试

 内存测试主要是为了检测被测试应用在进行正常使用情况下,该应用消耗手机内存的情况,如果内存消耗过大就造成手机使用卡顿等现象,进而影响用户体验,甚至会影响日活数据和用户留存等情况。因此,通常情况下,移动端应用内存占用大小也是产品一个比较重要的关注点和测试重点。为了保证应用不占用过多的系统资源,且能够及时释放内存,保证整个系统的稳定性,关于内存测试需要引入几种概念:

1、  空闲状态:指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲

2、  中等规格:对应用的操作时间的间隔长短不一,中等规格时间较长

3、  满规格:对应用的操作时间的间隔长短不一,满规格时间较短

 

测试时,可根据用户的操作习惯进而设置应用使用等级设置。下面是对几种内存测试方法进行整理,可根据不同的测试场景和需求,选择对应测试方案以便获取相对准确的内存数据。

 

目前存在的android的内存测试方法可以分为以下几类:

1、  使用Android自身提供的 ActivityManager.MemoryInfo() 方法获得,通过该方法获取某应用的内存信息。目前网易Emmagee,腾讯的GT等工具都是通过该方法实现某应用内存数据的获取,测试简单方便,安装app以后选中对应的应用即可开始测试,完成测试后即可在本地sd卡中保持一份性能测试的数据,可从里面获取内存信息。

2、  使用android提供adb指令集获取内存信息即adb shell dumpsys meminfo | grep packagename or pid 来获取


2.1dumpsys获取内存数据

指令:adb shell dumpsys meminfo

通过上述指令可以查看所有应用的内存消耗情况

 


如果想查看某一应用或某一个进程的详细的内存信息,可用如下指令:

指令:adb shell dumpsys meminfo packagename or pid

      

 

从上面的Heap size类别中包含Native HeapDalvik Heap两部分Heap,其中dalvik就是平时说的java堆,我们创建的对象都在这里分配的。其中,dalvik heap不能超过最大限制,超过最大限制就会出现OOM

 

2.2、查看单个应用程序最大内存限制的指令:

 adb shell getprop | grep or findstr heapgrowthlimit

上述查看到的单个内存最大限制为128MB,而meminfo里面dalvik heap size的最大值如果超过了128M就可能出现OOMdalvik.vm.heapgrowthlimitdalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明androidlargeHeap=“true”,声明后,如果应用的dalvik heap 达到heapsize的时候才会出现OOM!另:设备不一样,最大内存的限制也可能不一样

C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。这是因为Android系统对dalvikvm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M24M16M等,视机型而定),可以通过adb shell getprop | grep dalvik.vm.heapgrowthlimit查看此值。

也就是说,程序发生OMM并不表示RAM不足,而是因为程序申请的java heap对象超过了dalvik vm heapgrowthlimit。也就是说,在RAM充足的情况下,也可能发生OOM

 

2.3、查看单个应用的内存占有量的情况,通常用如下手段查看

#查看单个应用程序最大内存限制:adb shell getprop|grep heapgrowthlimit

#应用启动后分配的初始内存: adb shell getprop|grep dalvik.vm.heapstartsize

#单个java虚拟机最大的内存限制:adb shell getprop|grep dalvik.vm.heapsize

 

3、  使用android 提供的procrank获取即可

 通过指令:adb shell procrank | grep packagename

通过adb shell procrank指令可以获取VSSRSSUSSPSS

VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

其中USS只能通过procrank获取,首先网上下载libpagemap.so, procmem, procrank,然后pushandroid手机中。有的root机自带这几个文件,不需要额外下载。

 

4、  通过ADT插件DDMS查看用内存MAT进行分析

利用DDMSHeap可以很方便的查看app的内存占用情况,在app运行时,打开DDMS选项,在Devices下,可以看到正在运行的App,选择要查看内存的App,点击该条目,并选择Update Heap,如下图:

 

Heap职工,选择Cause GC,可以查看应用的占用情况,具体如下图:

 


如果你看的意犹未尽,如果你想随时随地充实自己,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~


大咖招募
欢迎App研发/测试方面的大牛来投稿,开设专栏。我们提供丰厚的稿酬,预约个人专访,帮助建立个人技术品牌!
立即投稿

我要评论

字数不能超过140字,谢谢!
提交

评论({{allComments.length}})

{{comment.create_time.substr(0,16)}}

显示所有评论
复制成功!