【 Android 场景化性能测试】内存性能及内存泄漏篇

作者:陈帅团队:腾讯移动品质中心TMQ

一、数据源

APP占用内存的测试,要比CPU的更为简单。App memory数据来源是dumpsys meminfo。当然,首先需要了解清楚dumpsys里面这些数值的含义是什么,这里不详述。

Android程序内存主要是两部分:native和dalvik。dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是native+dalvik 不能超过最大限制,否则OOM。

图一dumpsys meminfo信息

二、数据采集

与CPU耗电jiffs数据的采集一致,直接继承Performace基类,然后使用threading.Timer定时器来每隔3秒运行一次__fun_get_mem,调用dumpsys meminfo来获取相关内存信息。如下图中,只收集了TOTAL的数据,如果要具体分析native和dalvik的内存信息,也可以将其数据单独过滤出来保存。start()在主路径的set_up()中调用,保证在执行test() UI自动化场景用例时,定时器一直在收集数据,直到tear_down()调用stop()将定时器取消。

图二内存信息收集逻辑

三、数据使用

评估一个使用场景是否存在内存泄漏,如从APP首页进入一个二级页面,我们只需要将这个操作封装成UI自动化,重复执行N遍,即可获得如下数据曲线。只要数据曲线不是如下图中的灰色平缓曲线,则可以证明该场景是有内存泄漏的。

图三内存泄漏示意图

同样,如果只提供上述的曲线给开发,定位问题也会比较麻烦,测试在内存泄漏的测试中,也可以多做一些。如果是Dalvik内存泄漏,也可以使用Android Device Monitor dump出一份hprof文件(别忘了先手工Cause GC)。

图四DDMSdump内存

拿到hprof文件后,可以导入Android Studio中查看,一般查看Retained Size占用最大的类,分析是否有内存泄漏,一个对象的ShallowHeap,指的是该对象自身占用内存的大小。一个对象的 Retained Heap, 指的是当该对象被GC回收时,所释放掉的内存大小。由于该对象先前可能直接或间接持有对其他多个对象的引用,那么当它自己被回收时,被它所引用的其他对象有些也可能会被回收,所以这种情况下,该对象的Retained Heap既包括他自身占用内存的大小,也包括所有被它直接或间接引用的某些对象占用内存的大小。

图五使用Android Studio查看内存泄漏

Android Studio的分析不够强大,也可以借助MAT来分析内存泄漏:更多内容参考http://blog.csdn.net/cleverGump/article/details/52013873。

在链接内容中,可以关注下GIMP相关的内容,因为在APP中因为内存泄漏引起OOM一般会跟图片有关,其他对象往往没有bitmap对象大,所以解决图片相关的内存泄漏是优先级非常高的。

篇幅有限,还有很多深入的内容无法一一铺陈,后续将继续深入学习内存泄漏测试的相关内容。

搜索微信公众号:腾讯移动品质中心TMQ,获取更多测试干货!

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

AWStats日志文件中的一些术语解析

Number of visits made by all visitors. 所有用户的访问总数。

784
来自专栏北京马哥教育

用Python+MySQL实现2017年web日志分析报告

日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。目前,开源的ELK系统是成熟且功能强大的选择。但是部署及学习成本亦然不低,这里我实现了一个方法上...

3287
来自专栏逸鹏说道

项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作。 概况 现在的系统是基于RabbitHub(一套开源...

2746
来自专栏微信终端开发团队的专栏

Android M doze特性预研

Android M doze特性预研 2015年5月29日GoogleI/O大会发布新一代Android系统 - Android M preview 版本(AP...

2058
来自专栏Play & Scala 技术分享

Play For Scala 开发指南 - 第1章 Scala 语言简介

2716
来自专栏java架构师

Hadoop总结篇之一------开篇

从今天开始新的系列:Hadoop总结篇 之前的hadoop学习篇由于是学习过程中随手记下来的一些内容,不具有系统性。所以在这个系列中,将凭着这段时间的研究心得,...

2565
来自专栏dotnet core相关

不要使用Resource Owner Password Credentials

最近公司项目在做一些重构,因为公司多个业务系统各自实现了一套登录逻辑,比较混乱。所以,现在需要做一个统一的鉴权登录中心,准备用IdentityServer4来实...

794
来自专栏大魏分享(微信公众号:david-share)

NGINX的定制化 | API Management学习第四篇

3 SCALE中API gateway,是基于NGINX(OpenResty Web Platform = Nginx + Lua )。

1052
来自专栏CSDN技术头条

NewSQL数据库大对象块存储原理与应用

一、前言 企业内容管理(EnterpriseContent Management,ECM)系统是一种管理非结构化内容的系统,传统代表为EMC Document...

1815
来自专栏在线教育技术团队专栏

对于服务端bug处理的一些建议

清楚bug所在业务的逻辑,了解正常的流程应该是什么,业务的入口在哪里,重现的步骤

711

扫码关注云+社区