源码:LeakCanary

news/2024/5/19 19:18:50/

一、介绍

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

二、使用

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…

多线程基础

1.多线程基础概念 多线程&#xff1a;让程序同时做多件事情 多线程作用&#xff1a;提高效率 并发&#xff1a;在同一时间&#xff0c;有多个指令在单个cpu上交替执行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个cpu上同时执行 2.多线程的实现 (1)继承Thread类…

电脑卡顿反应慢怎么处理?电脑提速,4个方法!

案例&#xff1a;电脑卡顿反应慢怎么处理&#xff1f; 【快帮帮我&#xff01;我的电脑现在越用越卡了&#xff0c;有时候光是打开一个文件都要卡好几分钟&#xff0c;我真的太难了&#xff0c;有什么可以加速电脑反应速度的好方法吗&#xff1f;万分感谢&#xff01;】 随着…

es7.x集群部署-多台物理机部署-docker环境部署-docker-compose管理

es集群部署文档 部署es服务的三台服务器的ip和host分分别是&#xff1a; iphost_name192.168.1.2web02192.168.1.3storage02192.168.1.4Storage03 这个配置需要在服务器上编写对应的hosts文件&#xff0c;然后才可以使用host进行配置。 本次部署没有外挂配置文件&#xff0…

手把手教你 DVOL

分享本文在朋友圈的读者可获得本文数据和 Python 代码。留个言说已分享&#xff08;不用截屏&#xff09;我相信你&#xff0c;我会发给你百度盘下载链接。 本文长度为 6393 字&#xff0c;建议阅读 32 分钟 题图&#xff1a;SignalPlus Dashboard 0 引言 Deribit volatility (…

Qt音视频开发37-识别鼠标按下像素坐标

一、前言 在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询等;…

记录webpack安装

在安装完 yarn以后&#xff0c;yarn安装_阿巴资源站的博客-CSDN博客 然后开始安装webpack 看网上有人说npm install webpack-cli -g没成功&#xff0c;于是没试直接跳过坑 sudo npm install webpack -g --unsafe-permtrue --allow-root 然后提示&#xff1a; webpack -v On…

RabbitMQ:消息中间件

文章目录 概念管理界面简介4中常见交换器类型1.Direct交换器:2.Fanout交换器3.Topic交换器4.headers交换器 对象类型消息传递同步等待使用代码创建队列待续...... 概念 在微服务架构中项目之间项目A调用项目B 项目B调用项目C项目C调用项目D。。 用户必须等待项目之间内容依次的…

【闲聊杂谈】HTTPS原理详解

HTTPS和HTTP的区别 HTTP虽然使用极为广泛, 但是却存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付, 网络交易等新兴应用中安全方面最需要关注的。 关于 HTTP的明文数据传输, 攻击者最常用的攻击手法就是网络嗅探, 试图从传输过程…

亚马逊广告运营常见问答

同一个广告组中&#xff0c;建议投放多少个关键词呢&#xff1f; 同一广告组下我们建议投放的关键词至多不超过50个。 1.如关键词设置过少&#xff08;且前期无法用数据佐证其精准引流效果时&#xff09;&#xff0c;有可能导致广告曝光量较低&#xff1b; 2.如关键词设置过多…

SAS学习第9章:卡方检验之适合性检验与独立性检验

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度&#xff0c;实际观测值与理论推断值之间的偏离程度就决定卡方值的大小&#xff0c;如果卡方值越大&#xff0c;二者偏差程度越大&#xff1b;反之&#xff0c;二者偏差越小&#xff1b;若两个值完全相等时&#xf…

查询练习:按等级查询

建立一个 grade 表代表学生的成绩等级&#xff0c;并插入数据&#xff1a; CREATE TABLE grade (low INT(3),upp INT(3),grade char(1) );INSERT INTO grade VALUES (90, 100, A); INSERT INTO grade VALUES (80, 89, B); INSERT INTO grade VALUES (70, 79, C); INSERT INTO …

U-Boot 命令使用

进入 uboot 的命令行模式以后输入“help”或者“&#xff1f;”&#xff0c;然后按下回车即可查看当前 uboot 所 支持的命令&#xff0c;如图 所示&#xff1a; 我们输入“help(或?) 命令名”既可以查看命令的详细用法&#xff0c;以“bootz”这 个命令为例&#xff0c;我们输…