源码:LeakCanary

news/2024/12/23 4:25:00/

一、介绍

自动检测内存泄漏的检查工具

二、使用

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'

debugImplementation只在debug模式的编译和最终的debug apk打包时有效

Memory Profiler 使用步骤

  1. 生成的内存泄漏快照 会放在sdcard/Download/leakcanary-包名下
  2. 直接双击打开,把Activity/Fragment Leaks 和 Project Classes 勾选上,就可以看到泄漏的Activity/Fragment

三、内存泄漏常见分析工具

  • MAT:Memory Analyzer Tools
  • Memory Profiler:AS自带
  • LeakCan ary

四、LeakCanary源码分析

1.初始化

  • 在使用LeakCanary的时候直接一行依赖就可以了,不需要用户调用初始化。
  • leakcanary 通过 ContentProvider 进行初始化
  • AppWatcherInstaller#oncreate()中调用了真正的初始化代码AppWatcher.manualInstall(application)
  • AndroidManifest.xml中注册该provider,注册的ContentProvider会在 application 启动的时候自动回调 oncreate方法。
internal sealed class AppWatcherInstaller : ContentProvider() {/**[MainProcess] automatically sets up the LeakCanary code that runs in the main app process. */internal class MainProcess : AppWatcherInstaller()internal class LeakCanaryProcess : AppWatcherInstaller()override fun onCreate(): Boolean {val application = context!!.applicationContext as ApplicationAppWatcher.manualInstall(application)return true}//...}

AppWatcherInstaller类直接继承ContentProvider,而ContentProvider是注册即执行

AppWatcherInstaller的注册就是在leakcanary-object-watcher-android文件夹的AndroidManifest.xml中

    <application><providerandroid:name="leakcanary.internal.AppWatcherInstaller$MainProcess"android:authorities="${applicationId}.leakcanary-installer"android:enabled="@bool/leak_canary_watcher_auto_install"android:exported="false" /></application>

总结:

        App的创建过程,是由zygote fork 一个app进程,然后会调用ActivityThread的main函数,在ActivityThread里,完成 Application的初始化前,会先完成contentProvider的初始化。

        LeakCanary就是使用这个原理,创建一个ContentProvider,通过它来完成初始化

2.自动检测并报告内存泄漏

        LeakCanary完成初始化的时候,会通过注册监听Activity、Fragment的生命周期。

        核心类:RefWather,来实现内存泄露检测

        主要是通过弱引用(WeakReference)和引用队列(ReferenceQueue)来检测对象是否被释放。因为在Reference所引用的对象被gc回收时,该对象将会被加入到引用队列的末尾。

  1. 为要被观察的对象,添加一个弱引用对象与之关联,并且为这个对象添加一个唯一标识,然后把弱引用对象放到观察列表中。

  2. 然后会不断的监听引用队列,在界面退出时,过5秒钟如果引用队列中找不到观察列表中的对象(因为如果对象被释放,会添加到引用队列),那么就把它移动到怀疑列表中。

  3. 最后把怀疑列表中的对象进行可达性分析,如果还存在一条引用链,则说明该对象发生了内存泄露


http://www.ppmy.cn/news/48262.html

相关文章

SSR在天猫优品大促会场的探索实践

BBC 发现其网站加载时间每增加一秒&#xff0c;用户便会流失 10%。为提高页面的秒开率&#xff0c;我们不断探索着优化策略&#xff0c;仅仅在浏览器领域下的优化已经满足不了我们的极致要求&#xff0c;开始往服务端方向不断探索。本文将讨论业务接入SSR的几个问题&#xff1a…

Spring Security --- formLogin配置

目录 环境准备 配置自定义登录表单页面 配置登录成功的跳转页面方式 配置登录失败的跳转页面方式 前端表单参数获取 CustomWebSecurityConfigurerAdapter配置类代码示例 环境准备 创建springboot项目引入spring security框架引入thymeleaf模板引擎 配置自定义登录表单页面…

水平居中、垂直居中的几种方法

水平居中的方法&#xff1a; 若是针对inline, 内联块inline-block, 内联表inline-table, inline-flex元素及img,span,button等元素 父元素设置 text-align:center; 绝对定位&#xff1b;弹性布局&#xff1b;grid网格布局 不定宽块状元素 设置 margin&#xff1a;auto; 绝对定…

第二章:uniapp整合axios之真机测试两问题

第二章&#xff1a;uniapp整合axios之真机测试两问题 上一章节&#xff0c;笔者编写了uniapp整合axios并实现前后端跨域请求的方案&#xff0c;完成了这些基本配置后&#xff0c;在浏览器端的测试基本是可以完成了&#xff0c;但是当笔者将程序运行到手机时&#xff0c;却出现…

springboot mybatis-plus 对接 sqlserver 数据库 批处理的问题 批量更新添加数据 方案三

问题&#xff1a; 在对接 sqlserver数据库的时候 主子表 保存的时候 子表批量保存 使用的 mybatis-plus提供的 saveOrUpdateBatch saveBatch 这两个方法 但是 报错 报错内容为 &#xff1a; com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果。 框…

springboot web项目统一时区方案

背景 springboot项目国际化中&#xff0c;会遇到用户选择的时间和最终存到数据库的时间不一致&#xff0c;可能就是项目开发和部署时的时区没有处理好&#xff0c;导致时间转换出现了问题。 先了解时区都有哪些&#xff1a; 1.GMT&#xff1a;Greenwich Mean Time 格林威治…

Kubernetes Operator开发

案例一 Traefik Operator开发 1.kubebuilder 创建项目 2.Crontroller开发与部署 开发环境准备 kubebuilder 介绍 CRD的开发与部署 Crontroller开发与部署 Operator功能设计 借助operator完成 和企业内部注册中心打通 这里以Traefiketcd的模式为例进行演示说明 在这里etcd p…

1.2和1.3、GCC

1.2和1.3、GCC 1.2和1.3、GCC1.2.1、什么是GCC1.2.2、编程语言的发展1.2.3、GCC工作流程1.2.4、gcc和g的区别1.2.5、GCC常用参数选项实际操作①接下来进行预处理操作&#xff08;test.c为需要预处理的源代码&#xff0c;test.i为要生成的目标代码&#xff09;②汇编操作&#x…