Android内存监控与分析(一):内存泄漏(Memory Leak)与内存溢出(OOM)的表现

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


图1 内存监控与分析

一、内存泄漏(Memory Leak)与内存溢出(OOM)的表现
先说一下两者各自的表现情况:
1.内存泄漏是内存不断增长不释放,此时APP还是可以使用,随着时间的延长,可能出现卡顿,响应慢的情况。就像一个仓库,如果一直存入货物(入库)而不出库,或者入库比出库多,那么仓库的空间就会不断减少。图2是以TestMemory.apk为例,在autoMonkey压力测试过程中记录的内存情况(基于adb shell dumpsys meminfo $package or $pid命令封装的一个监控工具),可以看到其内存(Heap Alloc)大幅度波动,可能存在内存泄漏的问题。


图2 内存趋势详情

2.内存溢出(OOM)的情况:
我们知道手机的内存大小是从出厂就已限定;而Android系统为了防止内存空间被某一APP占满,每个APP程序使用内存空间也受到限制。即,Android进程最大内存空间。如果把手机内存比作存储大楼,那么Android进程是存储仓库。其中某一个仓库出现问题并不会致使整个大楼的坍塌;但是,千里之提,毁于蚁穴。如果不注意此类问题,必将导致手机变慢,程序闪退,甚至崩溃和重启等问题。言归正传,让我们了解内存溢出的两个情况,如下:
A.一次性内存不足,即超过Android进程最大内存。比如,一次性入库的货物超过仓库本 身的容量;不足的部分无法存储。无法存储的部分为溢出。如果强行将无法存储的货物入库,那 么仓库就会挤爆(crash)。不同手机有不同的进程最大内存限制,可以通过以下命令查看,图3:


图3 Android进程最大内存限制

B.因持续的内存泄漏导致内存不足而崩溃。显然,一直往仓库存储货物而不清除,最终的 结果是挤爆仓库。图4:


图4 内存溢出

所以,找到潜伏的内存泄漏问题非常关键。否则,等到出现内存溢出(可能是多处内存泄漏的原因),问题会非常严重。

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

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

更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android如何高效加载大图
  3. Android学习系列(14)--App调试的几个命令实践
  4. Android(安卓)技术: 追踪vm 如何调用基础类
  5. [置顶] android 跨进程通信
  6. android多activity退出整个程序的一个实现
  7. Android开发之进程与线程
  8. Android开发——应用程序生命周期
  9. Android属性系统(转载)

随机推荐

  1. Android笔记:Android后台接口教程一(从零开
  2. Android(安卓)插件化 动态升级
  3. 两份安卓学习资料,我建议你看完
  4. android之NDK(jni)开发笔记1——运行第一个
  5. Android高手进阶教程(二十五)之---Androi
  6. android实现ios形式的字体,实现各种自定义
  7. Android的消息机制,用Android线程间通信的
  8. Android(安卓)2020年最新保活方案 保活90
  9. 论“Android”在未来十年的发展
  10. Android学习建议