内存泄漏指的是那些应该被回收的内存没有及时得到回收的现象。
内存泄漏的治理的目的就是要让这些应该被回收的对象被回收。
产生的根本原因往往是应该被回收的对象被某个静态对象或者长时间存在的对象(如线程)持有。
记录一下项目治理的内存泄漏问题。

使用leakcannary2

1、引入依赖


在leakcannary2中使用了定义一个contentProvider,而contentProvider的初始化是在Application前的,通过这个contentProvider实现了逻辑的注入,因此不用进行其他操作,引入依赖即可。

2、运行应用

在运行应用后,会leakcannary自动开始检测内存变化,此时我们可以多打开几个Activity,此时leakcannary就会在检测到activity.onDestroy()后开始检测内存泄漏的情况。
我们可以看到leakcannary设置的前台Service中弹出相关的提醒,同时桌面上会出现一个leakcannary的app。
进入leakcannary的app后,我们就可以看到相关的内存泄漏情况:

我们点击对应的提醒泄漏项目进去就可以看到相关的泄漏引用关系图,藉此就可以开始排查、解决内存泄漏问题。

内存问题分析解决:

1、xxxx.init()

原因分析

xxxx.init()在初始化时会将传入的context对象放到静态声明mObject当中,static对象是常驻在内存中的,因此不会进行回收,与其产生引用关系的context因此也不会被回收。

解决方法

将传入的context由activity的context换成APP中唯一的ApplicationContext。

2、MsgCenter持有消息

原因分析

MsgObserver持有所有的添加进去的回调监听,该类也是个静态类,因此不会被回收。会产生内存泄漏的问题。

解决方法

提供外部调用接口,在停止使用的时候把该回调去除。


一定要注意对于这个回调接口的调用处要做判空处理!

3、UpdataManager持有回调接口

原因分析

原因同2相似,还是因为静态类持有监听接口的原因。

解决方法

不使用的时候将该接口释放。这里要注意对接口进行判空处理,防止调用的时候出现空指针异常。

4、UserInfoManager持有回调接口

原因分析

同2点,还是持有了回调接口,没有及时释放的原因。

解决方法

不使用的时候将该接口释放。这里要注意对接口进行判空处理,防止调用的时候出现空指针异常。

5、PreferenceManager持有context实例

原因分析

静态实例持有外部活动引用,在活动应该释放时没有得到释放。

解决方法

应该在活动停止使用时将其释放,并且在使用实例的时候增加判空逻辑。

6、LogoReplaceManager回调问题

原因分析

同2,还是静态对象持有外部回调接口,没有及时释放导致的问题。

解决方法

在不使用的时候将其释放。

总结

1、在使用静态类的时候,要时刻注意引用关系的梳理,对于一些应该及时释放的资源,例如最经典的回调,要提供给外部接口释放的途径,避免长期持有导致内存泄漏问题。
2、对于使用传入Activity的情景,如果可以的话尽量采用传入applicationContext,避免传入活动实体造成的内存泄漏问题。
3、在给静态类的某个回调进行置空释放后,对其相关的回调调用处要进行判空处理,避免造成空指针异常。

简单使用leakcannary2治理内存泄漏记录相关推荐

  1. C++ 内存泄漏检测工具valgrind简单使用

    C++ 内存泄漏检测工具valgrind简单使用 目录 C++ 内存泄漏检测工具valgrind简单使用 valgrind安装 valgrind测试内存泄漏 valgrind安装 通过软件商店下载: ...

  2. 如何避免JS内存泄漏?

    简介: 很多开发者可能平时并不关心自己维护的页面是否存在内存泄漏,原因可能是刚开始简单的页面内存泄漏的速度很缓慢,在造成严重卡顿之前可能就被用户刷新了,问题也就被隐藏了,但是随着页面越来越复杂,尤其当 ...

  3. JVM - 垃圾回收(垃圾标记阶段算法,内存泄漏与溢出)(2)

    2.垃圾回收相关算法: 2.1.垃圾标记阶段算法: 2.1.1 标记阶段的目的 垃圾标记阶段:主要是为了判断对象是否存活 1.在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首 ...

  4. 排查Javascript内存泄漏

    引言 也许你已经知道,Chrome DevTools里的Performance面板和Memory面板可以用来定位内存问题.但当你真正上手使用它们的时候,往往会觉得不知所措 -- 因为里面有着各种各样的 ...

  5. 使用Android Studio 查看内存泄漏

    用新版的AS 的profiler 查看内存泄漏 记录一下使用Android Studio 的profiler 查看内存泄漏的过程.新版的AS 的profiler 功`能强大.我们可以很方便的查看到一个 ...

  6. python ITK GetPixel方法导致内存泄漏

    最近使用ITK做图像配准,需要对图像进行像素级遍历,用以计算相似性度量函数,原生C++版ITK(Insight Toolkit)提供了一个Iterator机制应对这种大规模获取像素信息的情况,在ITK ...

  7. 常见的【内存泄漏】姿势

    关注公众号[高性能架构探索],第一时间获取干货:回复[pdf],免费获取计算机经典书籍 本文节选自文章: 内存泄漏-原因.避免以及定位 本文总结常见内存泄漏的几种方式,留意到这几点,可以避免95+%以 ...

  8. 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

    文章目录 一. 报错信息 二. 内存排查 三. 代码分析及修改 四. 不同版本说明 参考以下博客 : [Android 内存优化]Android Profiler 工具常用功能 ( 监测内存 | 内存 ...

  9. 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

    文章目录 I . 智能指针 引入 II . 智能指针 简介 III . 智能指针 简单示例 I . 智能指针 引入 1 . 示例前提 : 定义一个 Student 类 , 之后将该类对象作为智能指针指 ...

最新文章

  1. MySql按周,按月,按日分组统计数据
  2. HTML5 INPUT placeholder及兼容性处理
  3. 如何在全局程序集缓存 (GAC) 中安装 DLL 文件
  4. 关于UC、火狐、谷歌浏览器屏蔽布局中广告的解决办法
  5. Bootstrap4+MySQL前后端综合实训-Day01-PM【position定位的四种方式、Flex布局语法教程及案例(概念、容器属性、项目属性)、双飞翼布局复习、Bootstrap4 教程】
  6. java mysql报表T加1_MySQL报错: java.sql.SQLException: Column count doesn't match value count at row 1...
  7. Spring中AOP切面编程学习笔记
  8. linux chcon命令详解
  9. python中import sys_笨方法学python之import sys与from sys import argv的区别
  10. 编程珠玑:位图法排序
  11. Android 项目上线流程总结
  12. 研究计算机 英语,高职计算机英语多方法结合研究
  13. Intellij idea使用eclipse的java代码格式化文件
  14. Aras Innovator: 如何导入项目模板
  15. 累次积分怎么计算_把下列累次积分化为极坐标的累次积分,并计算其值 (3)
  16. Unity 版本更新
  17. Kali Linux虚拟机——安装VPN客户端
  18. EXCEL【数据处理之数据合并——字段合并】
  19. MapReduce解决乘用车辆和商用车辆的销售数据分析
  20. idea 安装破解版mybatis插件

热门文章

  1. vulnhub symfonos: 3.1
  2. 制作一杯热咖啡图片的PS实例教程
  3. 16-数据仓库之数据建模、数据建模表的分类、数据建模步骤、数据分层的原因和优点
  4. java设计模式之组合模式(树形层级)
  5. win10安装cuda以及conda、pip下载速度慢
  6. 程序猿,你是否知道这些网站
  7. 互联网名词 java中单词解释
  8. 云应用的概念、特性及部署
  9. python3.6/3.7中安装Crypto模块
  10. 单片机 ADC采集电压