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

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:感谢光荣之路的追逐和悟空老师悉心的指导和热情的帮助,让我获益匪浅!

猜你喜欢

转载自blog.csdn.net/Allan_shore_ma/article/details/78340931