测试环境:
版本信息:
安装包大小:
系统环境:OPPO R7s
操作系统版本:4.4.4
该文章目的:
抛砖引玉,旨在描述和指导如何在android上测试与分析app的内存情况
术语释义
- 空负荷:app已经在后台运行,但是用户没有使用;
- 中负荷:app在前台运行,用户进行了少量操作;
- 满负荷:用户持续频繁大量操作,app接近饱和状态运行。
一些经验:
除了第一种情况,其它两种的主观性很强,不是很容易区分。正常产品测试的时候,只要验证后台运行(510分钟为宜)和用户持续频繁大量操作(1015分钟为宜)这两种情况下就足够了;且可以借助安卓monkey脚本辅助。
第一步:用dumpsys meminfo 或 DDMS进行检测
通过adb shell获取应用运行时内存
adb shell dumpsys meminfo [$pid] or [$pkgName]
图解:
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
根据测试需要,一般会参考RSS和PSS,作为测试指标
通过DDMS Dump Heap进行检测/测试
图解:
Heap Size:系统分配给当前应用程序的总内存。对应读内存的代码: Runtime.getRuntime().totalMemory()
Allocated:应用程序当前占用的实际内存;
Free:分配的内存中的空闲内存。对应读内存的代码:Runtime.getRuntime().freeMemory()
三者之间的关系: Heap Size = Allocated + Free
第二步:反复执行具体场景,观察Heap Size和Allocated
- 如何判断有leak
Heap视图中有一行数据是叫data object,即数据对象。它是我们app中大量存在的类类型的对象。 在data object中有一列 Total Size ,它的值就是当前进程中所有java对象的内存总量。 一般情况下,这个值决定是否内存泄漏。
所以,不断的操作某个场景(比如反复提交数据,反复加载数据),Total Size的值一般会稳定在一个正常范围内。内存会有一个先增加(不断的生成对象),后下降(对象被回收)。如果程序的代码处理良好,那么内存占用量会有一个明显的回落,并且稳定在一个正常水平。内存占用量就没有一个明显的回落,并且会越来越高,那么就意味着有leak,最终出现OOM,被虚拟机kill掉程序。
第三步:利用MAT或YourKit进行分析
此处不描述,若感兴趣自行找些资料,比如http://blog.csdn.net/feng88724/article/details/6460918
补充--android检测内存泄漏的工具:
LeakCanary
参考资料
http://blog.csdn.net/yehui928186846/article/details/51387079
http://blog.csdn.net/feng88724/article/details/6460918
https://my.oschina.net/yyn2010/blog/112363
http://blog.csdn.net/duantihi/article/details/50791494
http://gdgzzch.blog.163.com/blog/static/37640452201371483147573/
http://hubingforever.blog.163.com/blog/static/17104057920114411313717/
https://developer.android.com/studio/profile/heap-viewer-walkthru.html