首页 > 其他分享 >LeakCannary 的主要原理

LeakCannary 的主要原理

时间:2022-11-05 15:33:19浏览次数:55  
标签:泄漏 检测 LeakCannary Activity onDestroy 主要 内存 activity 原理

大概可以分为以下几步:

((1) 监测Activity 的生命周期的 onDestroy() 的调用。

(2) 当某个 Activity 的 onDestroy() 调用后,便对这个 activity 创建一个带 ReferenceQueue 的弱引用,并且给这个弱引用创建了一个 key 保存在 Set集合 中。

(3) 如果这个 activity 可以被回收,那么弱引用就会被添加到 ReferenceQueue 中。

(4) 等待主线程进入 idle(即空闲)后,通过一次遍历,在 ReferenceQueue 中的弱引用所对应的 key 将从 retainedKeys 中移除,说明其没有内存泄漏。

(5) 如果 activity 没有被回收,先强制进行一次 gc,再来检查,如果 key 还存在 retainedKeys 中,说明 activity 不可回收,同时也说明了出现了内存泄漏。

(6) 发生内存泄露之后,dump内存快照,分析 hprof 文件,找到泄露路径(使用 haha 库分析),发送到通知栏

LeakCanary对于内存泄漏的检测非常有效,但也并不是所有的内存泄漏都能检测出来。

<1>无法检测出Service中的内存泄漏问题

<2>如果最底层的MainActivity一直未走onDestroy生命周期(它在Activity栈的最底层),无法检测出它的调用栈的内存泄漏。

所以说LeakCanary针对Activity/Fragment的内存泄漏检测非常好用,但是对于以上检测不到的情况,还得配合Android Monitor + MAT 来分析。

标签:泄漏,检测,LeakCannary,Activity,onDestroy,主要,内存,activity,原理
From: https://www.cnblogs.com/zuiniub/p/16860296.html

相关文章

  • js的bind 的原理
    js的bind方法主要绑定this的指向bind方法也会返回是个bind后的函数。知道它功能我们就可以自定义bind功能letobject={name:'jeff'}functionfn(){console.log(thi......
  • 7点 讲明白地图切片的概念与原理
      有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少......
  • 你知道Vue响应式数据原理吗
    1.Vue2的响应式式原理主要是通过Object.defineProperty的方法里面的setter和getter方法的观察者模式来实现。也就是在组件的初始话阶段给每一个data属性都注册一个setter......
  • ThreadLocal的使用及原理解析
    #基本使用JDK的lang包下提供了ThreadLocal类,我们可以使用它创建一个线程变量,线程变量的作用域仅在于此线程内。<br/>用2个示例来展示一下ThreadLocal的用法。**示例一:*......
  • 文件操作以及IO流原理及流的分类
    文件1、什么是文件?文件是我们保存数据的地方。2、文件流文件在程序中是以流的形式来操作的。流:数据在数据源(文件)和程序(内存)之间经历的路径输入流:数据从数据源(文件)到......
  • Andorid view 绘制原理
    承接上一篇:​​AndroidView绘制原理​​blog新地址:进入​​newbie’shome​​1.Onlayout()对于自定义View,分为两种:1.是自定义控件(继承View类).2.是自定义布局容器(继......
  • 京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用
    摘要随着云计算和人工智能的兴起,如何安全有效地利用数据,对持有大量数字资产的企业来说至关重要。同态加密,是解决云计算和分布式机器学习中数据安全问题的关键技术,也是隐私计......
  • 深入理解 Spring 事务原理
    Spring事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤......
  • 红黑树原理
    红黑树(RedBlackTree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。性质节点是红色或黑色。根节点是黑色。每个叶子节点(NIL)是黑色......
  • 深度解读Webpack中的loader原理
    一、前言webpack是一个现代JavaScript应用的静态模块打包器。那么webpack是怎样实现不同种类资源模块加载的呢?没错就是通过loader。loader用于对模块的源代码进行......