赞
踩
一、引言
相信很多小伙伴在做Android App测试的时候都遇到过这些情况:App Crash了、APP由于内存暴涨导致OOM了、APP运行卡顿不流畅了、APP流量电量耗费过快了等。我们如何在测试阶段及时的发现并定位问题的原因呢?正所谓工欲善其事必先利其器,要解决这些问题,我们必须要利其器,而且要全方位的利:功能测试、性能测试、自动化测试、兼容性测试、安全测试、覆盖率测试,一个都不能少。今天我们就先从性能测试的内存谈起,以后也会逐步完善这一系列的其他部分。
二、基本概念
在开始我们的内存测试之前,先不要着急,让我们从最开始的地方出发,一步一步的弄清楚我们要测什么、怎么测、以及如何分析。首先了解一些相关的基本概念吧。既然我们是在Android系统上做内存测试,那么就先从Android系统的分层架构谈起吧。
1.Android分层架构
Android的系统从上层到底层共包括四层,分别是应用程序层、应用框架层、系统库和Android运行时和Linux内核层。
1)应用层主要是提供核心应用程序包,如发邮件,日历等,由java语言实现;
2)应用框架,包括窗口管理器,内容提供者,视图系统等,开发可以访问提问的api进行程序设计,由java语言实现;
3)系统库和Android运行时也叫native层,主要是本地服务和链接库,包含了java语言所需要调用的函数和虚拟机等,c或者c++实现效率高;
4)linux内核,提供相应的协议和驱动。
那这跟我们的内存测试有什么关系呢?请大家注意上图中的dalvik virtual matchine,这是个什么东西呢,通常我们简写为DVM,现在大家是不是觉得熟悉多了,就是Android虚拟机,是Android系统中java 虚拟机,我们的程序就运行在这里面。看来我们还有必要了解一下JVM的内存模型。
2.JVM内存模型
我们一起来看一下java虚拟机的内存区域都有哪几部分:
1)方法区:用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。
2)程序计数器:当前线程所执行的字节码的行号指示器。
3)stack:当方法被执行时,存放函数地址、参数、局部变量、对象的引用,在方法执行结束时会自动释放,由操作系统负责
4)heap:程序运行时直接 new 出来的内存(对象实例)。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
了解完以上的概念之后,相信大家不难得出结论,我们做Android内存测试,就是测dalvik虚拟机里的heap嘛。在这里我必须承认大家真的是很机智,因为我们几乎已经要找到答案了,但是现实往往都很残酷,我们越是接近真相的时候越要加倍的小心,才能不会前功尽弃。为什么这么说呢,首先有一点是很正确的,我们在做内存测试的时候,确实几乎可以等同于在做heap的大小测试,但是并不仅仅只有java虚拟机里面的heap。从上面的Android分层架构模型中,我们知道dalvik虚拟机只是其中的一部分,并不是孙猴子一样跳出三界外,不在五行中呀,怎么可能不跟其他部分打交道呢,所以除了虚拟机里面的heap,还有native heap。
......
本文出自《51测试天地》原创测试文章系列(四十二)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。