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

目录
相关文章
|
2月前
|
算法 JavaScript 前端开发
新生代和老生代内存划分的原理是什么?
【10月更文挑战第29天】新生代和老生代内存划分是JavaScript引擎为了更高效地管理内存、提高垃圾回收效率而采用的一种重要策略,它充分考虑了不同类型对象的生命周期和内存使用特点,通过不同的垃圾回收算法和晋升机制,实现了对内存的有效管理和优化。
|
3月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
3月前
|
存储 C语言 C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(一)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
2月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
173 52
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
54 6
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
379 9
|
2月前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
75 6
|
2月前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
3月前
|
Web App开发 开发者

热门文章

最新文章