导语

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

一、什么是内存泄漏?

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

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

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

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

答:2种方法

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

  2. 可达性分析法
    这个方法设置了一系列的“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文件?(可参照前文图片)

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

  2. 找到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月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

我的标签

  • 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内存泄漏的简单检查与分析方法相关推荐

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

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d14047603a5bf1242ad01b 导语 内存泄漏问题大约是An ...

  2. Android 内存泄漏分析指北

    android 内存泄漏分析指北 简单来说内存泄漏就是当对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用 java 垃圾回收介绍: Java 虚拟机运行所管理的内存包括以下几个 ...

  3. Android内存泄漏的检测流程、捕捉以及分析

    https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...

  4. Android内存泄漏的分析和避免

    内存泄漏 Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆而导致程序 ...

  5. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  6. Android内存泄漏分析及调试

    2019独角兽企业重金招聘Python工程师标准>>> Android内存泄漏分析及调试 分类: Android2013-10-25 11:31 5290人阅读 评论(5) 收藏 举 ...

  7. android 内存泄漏分析工具,Android内存泄漏终极解决篇(上)

    一.概述 在Android的开发中,经常听到"内存泄漏"这个词."内存泄漏"就是一个对象已经不需要再使用了,但是因为其它的对象持有该对象的引用,导致它的内存不能 ...

  8. Android内存泄漏分析

    内存泄漏指的是程序中不再使用的对象对象由于某些原因无法被正常GC回收.对象没 有及时释放,就会占据宝贵的内存空间,因而导致后续分配内存的时候,内存空间不足出现OOM.如果无用对象占据的控件越大,那么可 ...

  9. Android 内存泄漏分析与解决方法

    Android 内存泄漏分析与解决方法 参考文章: (1)Android 内存泄漏分析与解决方法 (2)https://www.cnblogs.com/start1225/p/6903419.html ...

最新文章

  1. mongodb 用户 设计_MongoDB 是什么?看完你就知道了
  2. 阿里云数据库专家白宸:Redis带你尽享丝滑!(图灵访谈)
  3. AliOS Things KV组件的写平衡特性
  4. 前端接收pdf文件_如何实现springmvc将返回的给前端的pdf文件放在浏览器里预览
  5. leetcode 之Remove Nth Node From End of List(19)
  6. 关于Session接口的update方法主要有如下几点要注意
  7. 多功能时钟电路的设计框图_一种病理组织漂片多功能一体机的设计
  8. 数据结构-二叉树的非递归遍历
  9. ensp综合组网实验_关于实验室温度控制的那些事
  10. 《响应式Web图形设计》一7.4 减小文件尺寸
  11. 元旦和春节将至,抢票神器助君早日回家
  12. 历史上的今天:ATT 成立;全球最大分布式计算项目正式停止;家酿俱乐部首次会议...
  13. Linux命令解释之du
  14. Java编程题之某年某月某日
  15. linux修改文件:E212 can't open file for writing
  16. Spring中如何操作JDBC
  17. 爱快支持服务器网卡嘛,爱快软路由硬件支持
  18. 《深入浅出4G网络 LTE_EPC》阅读笔记一
  19. Spring Boot 项目结构介绍
  20. logging level级别

热门文章

  1. 202105110119 赵士豪
  2. 基于Android的健身app
  3. CGColor UIColor
  4. 基于springboot的手机点餐管理系统
  5. python操作execl常用方法总结
  6. CLIP(Contrastive Language-Image Pre-Training)简介
  7. 使用T-SQL语句操作数据表-查询数据
  8. 计算机文化宣传,计算机文化节活动宣传总策划书(doc 42页)
  9. oracle在线日志损坏,前在线日志文件损坏与ora-600 [4000]处理
  10. ad17 pcb扇孔_PCB扇孔处理