微信号:gh_c7d92d4feadd

介绍:学习互联网质量保证方法.深度解析BAT等一线互联网公司的质量保证体系.

Android性能测试(四)内存泄漏定位与解决

2016-11-17 16:27 BigHead

关键字:  Android  性能测试


现象:

       反复点击Android App的toolbar界面,返回后再继续点击,有时会发现页面打开速度变慢,甚至达到5s。


原因分析:  

      通常来看,页面加载慢可以分成两类

1)每次加载都慢,这一般是和页面布局,业务逻辑,后台服务接口响应速度慢

2)偶尔或时间长了就会变慢,通常是内存原因导致(也可能有其他原因,网络,风控等)


本次主要讨论对内存问题的排查方法和工具使用。


分析过程:

      分析内存使用,首先要绑定到进程,使用Android提供的DDMS,监控到进程使用的内存状况,监控的同时,复现并重复前面的操作过程,在执行过程中,使用DDMS中GC来进行垃圾回收,发现内存也没有下降。这说明,有应该有大部分对象一直没有释放,处于被引用的状态,而这些对象是分配在堆中,最后导致内存泄露。

     

       经过上面的初步分析后,下一步是进一步定位那些类或方法导致的。需要引入另外一个工具MAT来分析对象的内存占用和应用的关系。具体工具的使用方法这里不再讲述,大家可以自行查看相关资料。经过进一步分析,能够精准的定位到具体产生的问题的类的成员,通常是一个复合类型的对象。


基本原理:

      为了深入了解其产生的原因,有必要了解一下Android的内存管理方式,Android APP是运行在Adlvik虚拟机上的Java程序,而Dalvik是JVM的改造版本,在内存管理上的方法上,基本保持一致。在Java中的对象只能分配在堆中,包括所有运行时产生的对象(例如数组)也都是在堆中分配和管理的。Java另一个区域是栈,用于存储基本数据类型,这部分空间一般不会引起内存泄露,所以焦点只关注在堆空间即可。

     

      堆空间的对对象的管理是使用一种叫做引用计数的方式,当一个对象被引用时,计数器加1,当释放是计数器减1。每次Dalvik进行GC是,会将计数为0的对象所占的内存进行回收。而在GC之前,如果连续可用的内存比较少的现象就是内存碎片比较多,导致系统无法分配内存给其他对象,此时系统会执行GC过程,增加了系统的负载,这也会导致APP的加载、响应速度变慢。如果GC以后,有足够内存,则分配给对象即可,如果依然有大量对象没引用无法释放更多地空间,则出现内存溢出(Out Of Memory, OOM)。


解决办法:

    针对遇到的问题,将对象改为弱引用,保证每次GC时,都能释放对象占用的空间,保证系统可用内存充裕,解决这类问题。



 
互联网测试之道 更多文章 Android性能测试(三)内存检测工具--DDMS Android性能测试(二)内存检测方法 Android性能测试(一)入门篇 总统和副总裁 HTTP API自动化测试从手工到平台的演变
猜您喜欢 引以为戒:记一次心惊肉跳的服务器误删文件的恢复过程 荐书 | 我的IT学习书架 【科普贴】编程要从娃娃抓起的五大理由 开源电子书制作协作平台GitBook 我是如何获取新知识的?