Android内存监控与分析(二):测试中最常遇见的内存泄漏测试场景

APP测试中难免会有各种显式或者隐式的内存泄漏(Memory Leak)问题,如果不及时发现处理,可能会因为内存泄漏导致各种奇怪的问题(如,卡顿和闪退),甚至可能出现因内存不足(Out of Memory,简称OOM)而导致APP崩溃。
本文将通过实战分析内存泄漏和内存溢出问题,并在必要时说明原理或机制。结构分为四个模块,如图1:


图1 内存监控与分析

二、测试中最常遇见的内存泄漏测试场景
知道了内存泄漏和内存溢出的表现情况,那么我们需要模拟测试场景。在大部分应用中,经常会有一类功能是需要加载附加资源的,比如显示从网络下载的文本或图片。这类功能往往需要在内存中存放要使用的资源对象,退出该功能后,就需要将这些资源对象清空。如果忘了清理,或者是代码原因造成的清理无效,就会形成内存泄漏。我们的测试任务就是保证功能的正常,并且不会有遗留的内存对象造成泄漏。常见的测试方法包括Monkey/UIAutomator之类的常规压力测试、大数据或操作的峰值压力测试、长时间运行的稳定性测试等。这些方法都可以叠加在内存测试的方案中,观察这类场景下的应用内存情况,经常能够发现类似内存泄漏或内存溢出的问题。

(一)考虑监控与分析工具的选择。
1.有源码的情况:Android Monitor + MAT
2.无源码的情况:DDMS + MAT

(二)模拟内存泄漏测试场景(以TestMemory.apk为例,工具选择Android Monitor + MAT),步骤如下:
1. 输入端,不断的对APP进行操作,可以是我们的自动化脚本(如,autoMonkey),也可以是手工操作。不断点击“点击后增加内存”按钮,增加内存(当然,实际项目不一定呈现得如此明显);多次操作点击“点击后跳转到第二个页面”按钮,并返回。如图5:


图5 增加内存和跳转页面操作

2.一端进行物理资源的监控,可以使用Android Monitor等工具,或者自己基于adb 命令封装一个监控工具;Android Monitor工具监控内存增加情况,随着不断点击此按钮,内存不断上升。点击Android Monitor中的小车,触发垃圾回收(GC),如图6:


图6 Android Monitor监控内存增长

3.针对监控的资源,看内存是否持续上升。如果持续上升,肯定有内存泄露的问题;
4.在确定有内存泄露之后,可以在测试前 dump(通过Dump Java Heap按钮操作或者adb命令dump后导出)一个内存“快照”hprof文件,测试结束时候再dump一个hprof文件,去分析具体是哪一部分的代码存在泄露。所谓内存“快照”就是记录的当前内存信息。如图7:


图7 dump一个内存“快照”

5.在Android Studio中分析问题。如图8:


图8 Android Monitor分析内存问题

6.如果使用MAT(Memory Analyze Tool)分析内存问题,需把hprof文件转换为标准hprof文件。转换方法可以直接通过Android Studio导出,也可以通过%ANDROID_HOME%\platform-tools\hprof-conv软件转换。如图9:


图9 Android Studio导出内存“快照”

7.转换成标准hprof文件后,可使用MAT(Memory Analyze Tool)分析。MAT会给出更加详细的内存泄漏信息,详细情况可以打开Actions下的Histogram和Dominator Tree分析。对于一般的内存泄漏类问题,使用以上方法后通过MAT提供的分析报告就很容易识别出来。这些内存往往是加载后忘了释放的Bitmap,临时生成的byte数组和文件缓冲区,包含Handler的Activity,等等。另外,MAT提供对比两个hprof文件的功能(Compare Basket),帮助定位前后两次内存增长的情况。如图10:


图10 MAT分析工具

针对hprof文件,看下到底是哪些对象更多,占用的内存更大;这块需要和开发一起分析,也是最难的部分。要分析内存泄漏的原因,我们可以从代码分析内存泄漏的根本原因。

参考资料:
1.《深入理解Java虚拟机:JVM高级特性与最佳实践》,周志明 著,机械工业出版社
2.《移动App性能评测与优化》,TMQ专项测试团队 编著,机械工业出版社
3.文档,Android内存分析指南,追逐 编

PS:感谢光荣之路的追逐和悟空老师悉心的指导和热情的帮助,让我获益匪浅!

更多相关文章

  1. Android(安卓)AsynTask 与Thread 或线程池 使用分析
  2. 【转】android 内存泄漏相关收藏博客。
  3. Dalvik虚拟机JNI方法的注册过程分析
  4. android 属性系统,SystemProperties 的简介
  5. [置顶] PopupWindow在android中的使用分析
  6. [置顶] Android系统体系结构分析
  7. Android内存分析工具:Memory Profiler
  8. Android(安卓)获取内存信息(RAM,ROM)
  9. Android情景分析之属性服务

随机推荐

  1. ssh 免密码登录 与 密钥公钥原理讲解
  2. Solutions to terminal problems encount
  3. FreeSWITCH呼叫保持思路
  4. 如何为UDP组播设置一个套接字,并提供两个
  5. Centos7下安装与卸载Jdk1.8
  6. 写在2012里的2011总结
  7. 简单的程序发布流程
  8. 从零开始的linux 第十三章
  9. Linux FFmpeg 编译so动态库
  10. 如何使用virtualenv安装wxPython