您的位置:首页 > 移动开发 > Android开发

Android内存泄漏的简单检查与分析方法

2017-04-26 18:02 169 查看


导语

内存泄漏问题大约是Android开发者最烦恼的问题之一了,项目中连续遇到几个内存泄漏问题,这里简单总结下检查分析内存泄漏的一些工具与方法。


一、什么是内存泄漏?

大家都知道,java是有垃圾回收机制的,这使得java程序员比C++程序员轻松了许多,存储申请了,不用心心念念要加一句释放,java虚拟机会派出一些回收线程兢兢业业不定时地回收那些不再被需要的内存空间(注意回收的不是对象本身,而是对象占据的内存空间)。

Q1:什么叫不再被需要的内存空间?

答:Java没有指针,全凭引用来和对象进行关联,通过引用来操作对象。如果一个对象没有与任何引用关联,那么这个对象也就不太可能被使用到了,回收器便是把这些“无任何引用的对象”作为目标,回收了它们占据的内存空间。

Q2:如何分辨为对象无引用?

答:2种方法

引用计数法

直接计数,简单高效,Python便是采用该方法。但是如果出现 两个对象相互引用,即使它们都无法被外界访问到,计数器不为0它们也始终不会被回收。为了解决该问题,java采用的是b方法。

可达性分析法

这个方法设置了一系列的“GC Roots”对象作为索引起点,如果一个对象 与起点对象之间均无可达路径,那么这个不可达的对象就会成为回收对象。这种方法处理 两个对象相互引用的问题,如果两个对象均没有外部引用,会被判断为不可达对象进而被回收(如下图)。



Q3:有了回收机制,放心大胆用不会有内存泄漏?

答:答案当然是No!

虽然垃圾回收器会帮我们干掉大部分无用的内存空间,但是对于还保持着引用,但逻辑上已经不会再用到的对象,垃圾回收器不会回收它们。这些对象积累在内存中,直到程序结束,就是我们所说的“内存泄漏”。

当然了,用户对单次的内存泄漏并没有什么感知,但当泄漏积累到内存都被消耗完,就会导致卡顿,崩溃。


二、发现内存泄漏

内存泄漏不可小视,在Android开发中,比如说一个Activity页面会占用许多资源开销,如果页面发生泄漏,关闭以后页面没有能被系统回收,对应用程序的伤害是很大的。

Q1:在Android开发测试中一般如何发现内存泄漏的发生呢?

答:

方法1:反复操作观察内存变化

内存泄漏常见变现为程序使用时间越长,内存占用越多。那我们通过反复操作应用,比如反复点开/关闭页面,观察内存变化状况是否一点点上涨,可以粗略地判断是否有内存泄漏

1.通过 DDMS 中的 heap 工具,可以查看应用内存的使用情况



2.Android studio也可以方便查看



方法2:通过代码检测Activity泄漏

基本思路:

1)debug版本可以起一个长期工作的线程LeakThread在后台专门做泄漏检测

2)向Application注册一个 页面生命周期 的监听:application.registerActivityLifecycleCallbacks

3)在监听类中对 onActivityDestoryed(Activity activity) 的事件回调做处理:

如果一个Activity走到onDestroy,那么这个Activity对象就是需要被回收的目标。

我们声明一个检测对象的弱引用ref = new WeakReference(activity)。

 

PS:与强引用和软引用相比,弱引用不会被回收器当做一个“有效”的引用,不会影响其引用对象的释放。实际上,垃圾回收器会毫不犹豫地回收只有弱引用的对象~

4)在 LeakThread中我们每隔一段时间检测一下ref.get() 是否为空,为空说明activity已被释放。不为空可以手动触一次发gc;如果超过一段时间,比如50s,页面对象还未被清理,我们可以推断内存泄漏的发生.

5)当内存泄漏发生时,提示给开发者,并自动dump出.prof文件。

因为代码检测不是这里的重点,代码就不贴了,只记思路。


三、分析内存泄漏(DDMS dump + MAT分析)

发现可能出现内存泄漏时,我们需要对.prof文件进行分析,方能快速定位到是哪个倒霉家伙导致了内存泄漏


3.1、如何dump出.prof文件?(可参照前文图片)

打开DDMS ,Eclipse 可以切到DDMS视图,Android studio可以从Tools-Android-Android device monitor进入DDMS

找到app的进程,在进程上方点击“update heap”按钮,可以先主动出发一次GC,待内存占用数据稍微稳定下来后 点击“Dump HProf File”,便可以导出.prof文件


3.2:导出.prof文件后如何分析?

Android studio可以直接打开prof文件。点开Analyzer Tasks的面板,点击右上角的开始按钮。



分析完成后,发生内存泄漏的页面对象会出现在Analysis Results面板-Leak Activityes的目录下。

如图,原来泄漏发生是LoadingRoomActivity的锅!




3.3 进一步分析泄漏的原因,你会需要一个好用的内存分析工具:MAT

在官网可以下载到它:

http://www.eclipse.org/mat/downloads.php

虽然MAT不会准确告诉你你的代码哪泄漏了,但是它会给你发现哪泄露的数据和线索。

3.3.1 打开.hprof前可能遇到的问题:


在MAT中打开.prof页面,你可能会遇到一点小挫折:



如上图,可能会弹出 ‘Parsing heap dump from xxx has encountered a proplem’ 的错误弹窗

这是因为文件版本和编辑器能支持的版本有冲突的原因。

解决方案如下:

Sdk安装目录下platform-tools里有一个hprof-conv工具可以解决该问题。在cmd控制台执行:
hprof-conv input.hprof output.hprof


重新再MAT打开output.hprof 就可以打开了~

值得一提的是,如果你dump出的文件太大的话,也有可能发现打不开的现象,这时候,打开安装MAT目录下的MemoryAnalyzer.ini 把-XmX改大些重启即可。但是也不要改得比你机器的可用内存还大,不能太贪心哈哈~




3.3.2 打开.phrof文件后的分析


通过MAT打开.phrof文件后,会弹出Overview 和 Leak Suspects 2个标签页。

Leak Suspects标签页可见如下图:



Leak Suspects视图展示了app内存占用的比例,浅色是空闲的内存,其他是内存占用的空间。每块内存对应的问题也都列在下面。点开每个Problem Suspect下的details,可以看到有哪些类的实例占用了内存和占用大小等信息~



此时我们已经有了怀疑的目标,为了更清晰地查看,我们可以回到Overview页面,打开Histogram页面:



在打开的Histogram标签页中,我们填入检测对象,在列出的匹配项中过滤掉对象的非强引用。



到这里我们就可以看到,是哪个坏蛋hold住了你的对象了。MAT能够给到的支持也就到这里,接下来,还是需要你根据这些线索到代码中寻找判别和修正了~``



更多精彩内容欢迎关注腾讯优测的微信公众账号:



腾讯优测是专业的移动云测试平台,为应用、游戏,H5混合应用的研发团队提供产品质量检测与问题解决服务。不仅在线上平台提供「全面兼容测试」、「云手机」等多种质量检测工具,同时在线下为VIP客户配备专家团队,提供定制化综合测试解决方案。真机实验室配备上千款手机,覆盖亿级用户,7*24小时在线运行,为各类测试工具提供支持。

标签: 内存泄漏android腾讯优测

好文要顶 关注我 收藏该文 

 






腾讯bugly
关注 - 0
粉丝 - 259

+加关注

0

0

« 上一篇:【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
» 下一篇:【腾讯Bugly干货分享】Android
Linker 与 SO 加壳技术

posted @ 2016-09-12 14:08 腾讯bugly 阅读(3133)
评论(0) 编辑 收藏

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。

【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】群英云服务器性价王,2核4G5M BGP带宽 68元首月!
【福利】阿里云免费套餐升级,更多产品,更久时长





最新IT新闻:

· 腾讯市值逼近3000亿美元 上市以来股价飙升55倍

· 美国一男子喝醉酒狂殴硅谷明星机器人:惨遭逮捕

· 陈一丹、俞永福、丁磊、张朝阳就版权保护问题进行了主题发言

· 京东服饰正式成为美国AAFA协会官方认证会员

· 确认了AI作为自己的支柱后,亚马逊云服务如何赢得AI大战的未来?

» 更多新闻...





最新知识库文章:
· 唱吧DevOps的落地,微服务CI/CD的范本技术解读

· 程序员,如何从平庸走向理想?

· 我为什么鼓励工程师写blog

· 怎么轻松学习JavaScript

· 如何打好前端游击战

» 更多知识库文章...


公告

昵称:腾讯bugly

园龄:1年5个月

粉丝:259

关注:0
+加关注

<2017年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456


搜索

 

 


常用链接

我的随笔

我的评论

我的参与

最新评论

我的标签


我的标签

android(22)

Bugly(20)

安卓开发(19)

腾讯Bugly(19)

微信(9)

crash监控(9)

Crash(8)

iOS(8)

腾讯优测(6)

热补丁(6)

更多


随笔档案

2017年4月 (4)

2017年3月 (4)

2017年2月 (3)

2017年1月 (9)

2016年12月 (11)

2016年11月 (8)

2016年10月 (13)

2016年9月 (9)

2016年8月 (8)

2016年7月 (11)

2016年6月 (2)

2016年5月 (6)

2016年4月 (5)

2016年3月 (4)

2016年2月 (2)

2015年12月 (5)

2015年11月 (5)


最新评论

1. Re:【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲

666

--WE风中狼

2. Re:【腾讯Bugly干货分享】Android内存优化总结&实践

mark

--听着music睡

3. Re:【腾讯Bugly干货分享】经典随机Crash之一:线程安全

mark

--听着music睡

4. Re:【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲

写得很好!顶一个!i3综合社区:致力于网络、软件、源码、教程等分享与交流的平台!不定时更新海量免费资源(教程、软件、源码等),欢迎您学习与关注!官方网站www.i3zh.com/forum-43-1.......

--i3综合社区

5. Re:【腾讯优测干货分享】越用越卡为哪般——如何降低App的待机内存(一)

原来如此,涨姿势了

--顶尖APP开发-广州达到


阅读排行榜

1. 通往全栈工程师的捷径 —— react(13740)

2. 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲(8559)

3. 【Bugly干货】Android性能优化典范之多线程篇(7843)

4. 全站 HTTPS 来了(3883)

5. 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法(3133)


评论排行榜

1. 通往全栈工程师的捷径 —— react(68)

2. 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲(27)

3. 全站 HTTPS 来了(6)

4. 【腾讯Bugly干货分享】Android进程保活招式大全(5)

5. 【腾讯Bugly干货分享】React Native项目实战总结(5)


推荐排行榜

1. 通往全栈工程师的捷径 —— react(89)

2. 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲(67)

3. 全站 HTTPS 来了(13)

4. 【腾讯Bugly干货分享】React移动web极致优化(6)

5. 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试(5)

Copyright ©2017 腾讯bugly
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 android