继介绍稳定性ANR类故障和Crash/Tombstone类故障后,本章将介绍第三大类故障资源泄露及其典型场景、分析定位和解决方法。

1

 资源泄露问题原因分析

2

 典型泄露场景

  • 静态变量长期维持到大数据对象的引用,阻止垃圾回收;

  • 非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉;
  • Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个 target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收。由于AsyncTask内部也是Handler机制,同样存在内存泄漏的风险,这种内存泄露,一般是临时性的;
  • 资源对象未关闭

- Cursor

- InputStream OutputStreamIO流

- BraodcastReceiver

- ContentObserver

- Bitmap

应该在资源使用完毕,或者Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

常见内存泄露代码举例

  • 单例造成的内存泄露

context改为context.getApplicationContext()因为单例的生命周期和Application的一致。

  • 非静态内部类创建静态实例造成的内存泄漏

这样就在Activity内部创建了一个非静态内部类的实例,每次启动Activity时都会使用该实例的数据,这样虽然避免了资源的重复创建,不过这种写法却会造成内存泄漏,因为非静态内部类默认会持有外部类的引用,而又使用了该非静态内部类创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。正确的做法为:将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,请使用ApplicationContext。

  • Handler造成的内存泄露

当这个Activity被finished后,延时发送的消息会继续在主线程的消息队列中存活10分钟,直到他们被处理。这个message持有handler对象,这个handler对象又隐式持有着MainActivity对象.直到消息被处理前,这个handler对象都不会被释放, 因此MainActivity也不会被释放。注意,这个匿名Runnable类对象也一样。匿名类的非静态实例持有一个隐式的外部类引用,因此MainActivity将被泄露。

3

内存分析工具、常用命令及分析步骤

3.1 内存分析工具

  • Android Monitor

  • MAT(MemoryAnalyzer Tool)

3.2 内存分析常用命令

  • adb shell getprop | findstr heapgrowthlimit //查看当前产品单个进程支持最大内存

  • adb shell dumpsys meminfo //获取系统各个应用内存信息

  • adb shell dumpsys meminfo com.android.mms //获取短信内存信息

  • adb shell am dumpheap com.android.mms /sdcard/mms1.hprof //导出当前应用hprof文件

  • adb shell cat /proc/meminfo //查看当前内存占用情况

  • hprof-conv from.hprof to.hprof //hprof文件转换

3.3 分析内存泄露步骤

  • 通过Android Monitor的内存监控工具找到内存增长且GC后无法降低的必现条件;
  • 根据dump的hprof文件,使用AnalyzerTasks找到疑似泄露的Activity;
  • 使用MAT查看疑似泄露Activity的GC Root ,找到引用链中的泄露点;
  • 解除依赖关系。

4

 避免内存泄露的建议

1)对于生命周期比Activity长的对象如果需要应该使用ApplicationContext

2)在涉及到Context时先考虑ApplicationContext,当然它并不是万能的,对于有些地方则必须使用Activity的Context,对于Application,Service,Activity三者的Context的应用场景如下:

其中:NO1表示Application和Service可以启动一个Activity,不过需要创建一个新的task任务队列。而对于Dialog而言,只有在Activity中才能创建。

3)对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏。

4)对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,将内部类改为静态内部类,静态内部类中使用弱引用来引用外部类的成员变量

5)对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null。

6)保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期。

【往 期 精 选 文 章 回 顾

应用稳定性优化系列(二),Crash/Tombstone问题分析及定位

应用稳定性优化系列(一),ANR问题全面解析

hprof文件分析工具_应用稳定性优化系列(三),资源泄露问题分析及定位相关推荐

  1. pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...

    点击上方"蓝字"关注我们目录 系统设计 网络数据包分析系统的设计 整个网络数据报分析工具采用模块化的设计思想,原因是许多程序太长或太复杂,很难写在单一单元中.如果把代码分为较小的功 ...

  2. 关键词热度分析工具_亚马逊卖家: 产品关键词挖掘分析必备工具!

    做亚马逊的应该都知道,亚马逊的大部分流量都是来自于产品关键词的搜索,一个好的关键词可以大大的提高你的产品曝光,促进成交,还可以节省时间和成本,是增加流量最好的一个方法. 无论你是发布产品,还是优化Li ...

  3. mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告

    日志分析在web系统中故障排查.性能分析方面有着非常重要的作用.目前,开源的ELK系统是成熟且功能强大的选择.但是部署及学习成本亦然不低,这里我实现了一个方法上相对简单(但准确度和效率是有保证的)的实 ...

  4. python 内存泄漏分析工具_记一次调试python内存泄露的问题

    这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-debuging-coding-debuging之后, 终于上线了, 上线后心里美滋滋 ...

  5. Excel股票分析工具_每日连板清单

    Excel获取每日连板数据 对所有股票数据进行监控,选出涨停板股票清单: 可以查看昨日数据今日的涨跌情况    后端采用VBA通过API获取数据并创建前台分析链接 可以查看昨日数据在今日的涨跌情况, ...

  6. Excel股票分析工具_量化策略模拟

    在Excel中对量化策略进行模拟 根据优选算法,每日对所有股票数据进行监控和选择: 可以根据"买入日期"列判断是否当日选出股票: 后端采用VBA通过API获取数据并创建前台分析链接 ...

  7. 股票量化分析工具QTYX使用攻略系列——双底形态选股

    前言 自从股票量化分析工具QTYX新增双底形态选股功能以来,大家的反响一直很热烈.很多星球会员利用这个功能帮助自己抓到了大牛股. 确实,双底形态是由市场力量形成的,我们只需顺势而为即可,特别是大周期. ...

  8. 游戏优化系列三:Unity游戏的黑屏问题解决方法

    作者 大家好,我叫Jack冯: 本人20年硕士毕业于广东工业大学,于2020年6月加入37手游安卓团队:目前主要负责海外游戏发行安卓相关开发. 系列目录 游戏优化系列一:海外谷歌应用适配相关 游戏优化 ...

  9. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

最新文章

  1. scikit-learn朴素贝叶斯各种用法总结真正讲明白的,为作者建平点赞
  2. PCL中分割_欧式分割(1)
  3. 「Ubuntu」Problem executing scripts APT::Update::Post-Invoke-Success ‘if /usr/bin/test -w /var/lib
  4. javascript第一天
  5. 硬RAID可以为NVMe SSD数据可靠性保驾护航吗?
  6. 论文浅尝 | 基于动态知识图谱向量表示的对称合作对话代理的学习
  7. 有道云笔记Android app离线缓存,有道云笔记Android版升级 增加笔记离线阅读与收藏...
  8. css3文档手册chm_你还在使用CHM帮助文档吗?赶快试试Baklib吧
  9. 5.微服务设计 --- 分解单块系统
  10. 计算机表格应用试卷,计算机应用基础Excel试题库.doc
  11. 如何使用计算机讲解ppt,如何录制PPT讲解视频?
  12. 数值运算pythonmopn_python – 计算每列的Pandas DataFrame的自相关性
  13. 进程和线程之面试须知
  14. VS2017 安装 Microsoft Visual Studio Installer Project
  15. expect 中的回车和换行
  16. 从零开始带你称为MySQL实战优化高手(儒猿技术窝)
  17. 第1章 基础:逻辑和证明 部分内容
  18. latex 二重积分、三重积分、闭合积分公式
  19. html插入图像标签是什么,初学HTML 常见的标签(三) 插入类标签
  20. 传智播客教辅平台mysql题库_课堂管理系统;在线教辅平台;java课设

热门文章

  1. 数组 / 伪数组 判断及方法调用 (权威指南笔记)
  2. 2015/08/24
  3. Android 开发工具类 03_HttpUtils
  4. 站点的安全防范都是后端的职责?非也,Web前端安全同样不可忽视
  5. JetBrains系列序列号
  6. Python笔记4 实例之批量修改文件名
  7. Git(1)-- Win10 安装 Git 详细教程(超详细纯小白教程)
  8. 10行python代码爬取百度热榜
  9. Python程序打包成.exe文件(弹窗恶搞小程序附源码)
  10. 高中数学的复数:y=a + bi