开发者社区> com360> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

LeakCanary内存检测原理

简介: ## LeakCanary介绍 LeakCanary内存检测工具是由squar公司开源的著名项目。此项目主要用于内存检测。 开源鲜明的目录结构如下: leakcanary | |-leakcanary-analyzer |-leakcanary-android |-leakcanary-android-no-op |-leakcanary-
+关注继续查看

LeakCanary介绍

LeakCanary内存检测工具是由squar公司开源的著名项目。此项目主要用于内存检测。
开源鲜明的目录结构如下:

leakcanary |

       |-leakcanary-analyzer
       |-leakcanary-android
       |-leakcanary-android-no-op
       |-leakcanary-watcher
       |-leakcanary-simple
       
       

leakcanary-android,leakcanary-android-no-op是针对android的检查封装。
leakcanary-analyzer:用于分析dump文件
leakcanary-watcher:用于监控内存泄露
leakcanary-android-no-op:空实现。用于release版本的依赖。

理论上这两个包完全可以应用到普通的java项目中,可以看出squar的工程师模块化分的特别清楚。

leakcanary-watcher主要提供抽象,核心的内存检测,执行流程,leakcanary-android负责具体的周边业务实现。

leakcanary-analyzer主要用作分析dump文件,由leakcanary-android去调用,结果再展示给开发者。

LeakCanary进程和线程

leakcanary在主进程进行内存检测,并且只在主线程空闲的时候执行,在单独的leakcanary进程进行内存分析。

实现原理

在Android开发中,主要用于检测Activity,Fragment等组件的内存泄露。对于Activity的内存检测,主要是检测当Activity执行了onDestory()之后是否还在内存中,如果一直在内存中,GC无法回收,那么代表内存泄露了,内存泄露的原因基本上都是有地方强引用了这个Activity对象。

无侵入获取需要检测的Activity

通过Application.registerActivityLifecycleCallbacks(),注册Application.ActivityLifecycleCallbacks回调,之后的所有Activity的生命周期都会回调这个接口,当然包括void onActivityDestroyed(Activity activity)方法。

如何判断对象泄露

获取了要检测的Activity对象后,怎么样才能判断这个对象就泄露了呢?

LeakCanary主要利用了WeakRefrence引用的对象,当GC回收了这个对象后,会被放进RefrecenQueue中。

LeakCanary先主动调用GC,然后检测这个对象是否在ReferenceQueue中,如果在,说明没有泄露,如果不在,说明有泄露的嫌疑,此处只是嫌疑,不一定真的泄露了。

为了方便检测继承WeakRefrence实现了KeydWeekRefrence,提供了一个唯一识别的Key,有利于对象检测,包括后面的Dump分析。

如何获取Dump文件

android已经提供好了获取Dump文件的Api:

android.os.Debug.dumpHprofData("dump文件名称");

如何分析Dump文件

analyzer借助haha分析Dump文件,计算出泄露对象的最短强引用路径。

以上就是LeakCanary的原理分析。

下面是分析源码过程中的类图和时序图(PS:都不标准,只方便理解用)

LeakCanary类关系图.png

leakcanary init.png

leakcanary watch.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)
目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)
41 0
计算机组成原理与体系结构
计算机组成原理与体系结构
24 0
CRC-16 MODBUS原理,附实测可用源码
之前做串口解析,CRC校验一直用和校验,就是吧各个位加在一起,新来一个串口协议,是CRC-16 MODBUS的形式校验,不会呀,从网上找了找资源,没有找到源码,都要下载,分享出来。
93 0
计算机组成原理——移位运算
计算机组成原理——移位运算
86 0
重学计算机组成原理(一)- 冯·诺依曼体系结构
1 计算机的基本硬件组成 早期,DIY一台计算机,要先有三大件 CPU 内存 主板 1.1 CPU 计算机最重要的核心配件,中央处理器(Central Processing Unit)。 计算机的所有“计算”都是由CPU来进行的。
8718 0
6月7日云栖精选夜读:Spring-beans架构设计原理
IOC,官方给的定义是依赖注入(Dependency Injection)或者控制反转(Inversion of Control),都相当术语化,不太容易懂。 想象下日常中的生产过程,在生产之前是客户下单,单子上会详细注明需要的产品,包括产品的各方面规格属性,然后工厂据此生产。
2936 0
《计算机组成原理》----1.2 体系结构和组成
我们已经建立起计算机和系统这两个概念,我们还必须单独定义术语体系结构。计算机体系结构含有结构(structure)的意思,描述了一些与计算机组成方式有关的内容。之所以定义计算机体系结构,是因为不同的用户会从完全不同的角度看待计算机。
1874 0
《计算机组成原理》----2.8 浮点运算和程序员
整数操作是精确、可重复的。例如,在所有计算机上计算整数乘积x·y都会得到同样的结果。一台计算机上浮点单元的精度可能与另一个台上的不同,尽管IEEE浮点标准的引入已经大大改善了这一情况。
1333 0
+关注
com360
现就职于阿里巴巴集团飞猪事业群,从事Android客户端相关的架构和性能优化工作。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android内存泄露自动化链路分析组件——Probe
立即下载
Android内存泄漏自动化链路分析组件Probe
立即下载
低代码开发师(初级)实战教程
立即下载