源码:LeakCanary

news2024/11/15 16:00:01

一、介绍

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

二、使用

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 Application
    AppWatcher.manualInstall(application)
    return true
  }
  //...
  }

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

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

    <application>
        <provider
            android: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.coloradmin.cn/o/447711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node【Global全局对象】之【URL】

文章目录 &#x1f31f;前言&#x1f31f;URL&#x1f31f;URL组成部分&#x1f31f;URL 类&#x1f31f;url.href&#x1f31f;url.pathname&#x1f31f;url.port&#x1f31f;url.protocol&#x1f31f;url.search&#x1f31f;url.searchParams&#x1f31f;url.hash&#…

DAY829

学习目标&#xff1a;成就上瘾&#xff0c;学到欲罢不能 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背单词150个&#xff0c;背《死亡诗社》经典语段&#xff0c;抄写…

【web前端开发】CSS定位

文章目录 1.定位介绍2.定位的方式2.1 相对定位2.2 绝对定位2.2.1 子绝父相 2.3 固定定位 3. 元素的层级关系4. 总结 1.定位介绍 定位有两个作用: 1.可以解决盒子和盒子之间的层叠问题 (定位之后元素层级最高,可以层叠在其它盒子上面) 2.可以让盒子始终固定在屏幕中的某个位置 …

shell呈现数据

shell脚本编程系列 理解输入和输出 目前为止了解了两种显示脚本输出的方法&#xff1a;在显示器屏幕上显示输出&#xff0c;将输出重定向到文件中&#xff0c;这两种方法将数据输出全部显示出来&#xff0c;要么什么都不显示&#xff0c;但有时一部分数据显示屏幕上&#xff0…

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中&#xff0c;都会线加载一张图片然后再进入闪屏页。这样&#xff0c;可以给用户很好的体验。 作用&#xff1a;避免加载白屏页面&#xff0c;进行业务的预处理&#xff08;网络检测、数据预加载...&#xff09; 界面组成…

基于Pyqt5快速构建应用程序详细教程

一、介绍 图形用户界面&#xff0c;更广为人知的名称是 GUI&#xff0c;是当今大多数个人计算机的一个特征。 它为不同计算技能水平的用户提供了直观的体验。 尽管 GUI 应用程序可能会使用更多资源&#xff0c;但由于其点击式特性&#xff0c;它们通常对用户友好。 PyQt 是可用…

最小生成树|二分图

最小生成树跟边的正负没有任何关系。 最小生成树 朴素Prime 该算法和Dijkstr算法很像。 先把所有距离初始化为正无穷 进行n次迭代 找到不在集合&#xff08;集合指当前的生成树&#xff09;当中的点&#xff0c;s数组表示当前已经在连通块&#xff08;生成树&#xff09;中的所…

vue-simple-uploader在VUE3中分片上传大文件

vue-simple-uploader是一个优秀的大文件分片上传组件&#xff0c;在vue2里面工作一切正常&#xff0c;但是在vue3里面却发现了一些问题&#xff1a; &#xff08;1&#xff09;在element-plus的el-dialog里面渲染失败&#xff1b; &#xff08;2&#xff09;上传进度条不能正…

由浅入深详解四种分布式锁

在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用synchronized锁或者Lock锁保证线程安全。synchronized锁是Java提供的一种内置锁&#xff0c;在单个JVM进程中提供线程之间的锁…

信息系统项目管理师,第四版应该如何应对

一、 改版情况。 2023年3月&#xff0c;新版教材起售。 2023年4月4日&#xff0c;官网宣布本次考试第三版第四版兼顾使用。 以历年的考试时间来看&#xff0c;一般这次考试是在 5月27日、28日附近。 接下来只有一个月左右的时间了。给大家聊聊面对现在这个情况如何备考。 …

考研计算机组成原理总结(7)

一.虚拟存储器 1.基本知识 主存和辅存共同构成了虚拟存储器&#xff0c;二者在硬件和系统软件的共同管理下工作。对于应用程序员而言&#xff0c;虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。 2.基本概念 虚拟存储器将主存或辅存的地址空间统一编址&#x…

如何提高图片清晰度?三种方法来帮你!

如何提高图片清晰度&#xff1f;图片在上传到网络后会被压缩&#xff0c;导致图片变得模糊。今天&#xff0c;我将分享三种方法&#xff0c;帮助您提高图片的清晰度。 方法一&#xff1a;使用记灵在线工具 工具地址&#xff1a;记灵在线工具 - 更专注于发现工具的实用性 该工…

[Linux 命令] ls 显示目录内容列表

ls 显示目录内容列表 思维导图 补充说明 ls命令 就是list的缩写&#xff0c;用来显示目标列表&#xff0c;在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示&#xff0c;以分区不同类型的文件。 语法 ls [选项] [文件名...][-1abcdfgiklmnopqrstuxABCD…

Node.js下载安装与简单使用

一、下载Node.js 打开链接&#xff1a;Node.js 的官网首页&#xff08;https://nodejs.org/en/&#xff09; 选择左边的 LTS 版本和 Current 版本的不同 1.LTS 为长期稳定版&#xff0c;对于追求稳定性的企业级项目来说&#xff0c;推荐安装 LTS 版本的 Node.js。 2.Current …

【系统集成项目管理工程师】项目质量管理

&#x1f4a5;十大知识领域&#xff1a;项目质量管理 项目质量管理包括以下 3 个过程: 规划质量管理实施质量保证质量控制 一、规划质量管理 规划质量管理是识别项目及其可交付成果的质量要求和标准&#xff0c;并准备对策确保符合质量要求的过程 这部分重点主要是工具与技术 1…

C语言从入门到精通第8天(分支结构if、else、switch的使用)

分支结构if、else、switch的使用 if语句if...else语句if...else嵌套if...else if...else语句switch语句 if语句 语法&#xff1a; if(表达式){ 语句&#xff1b; } 如果表达式为真&#xff0c;则执行{}里面的语句。如果为假&#xff0c;则不执行。示例代码&#xff1a; int m…

春秋云镜:CVE-2022-25488(SQL报错注入)

目录 一、题目 二、sqlmap梭哈查flag 一、题目 介绍&#xff1a; Atom CMS v2.0存在sql注入漏洞在/admin/ajax/avatar.php页面 进入题目; 发现是Not Found页面 一开始以为打开的问题&#xff1a; 一想 我们要访问的是/admin/ajax/avatar.php 访问后是空白页面&#xff1a…

进程树pstree介绍

进程树&#xff08;pstree&#xff09;是一个Linux/Unix命令&#xff0c;用于显示系统中所有进程的层次结构。它可以将进程展示为树形结构&#xff0c;其中每个进程都是一个节点&#xff0c;而每个节点下面的子节点是该进程的子进程。pstree可以按照进程的父子关系显示进程&…

[架构之路-172]-《软考-系统分析师》-5-数据库系统-5- 数据库设计与建模(逻辑设计-实体关系图ER图-关系图、物理设计)

目录 5 . 5 数据库设计与建模 5.5.1数据库设计阶段 1 . 规划&#xff1a;为什么做&#xff1f;能不能做&#xff1f; 2 . 需求分析&#xff1a;做成什么样子&#xff1f; 3 . 概念设计&#xff1a;怎么做 - 概念 &#xff08;用户&#xff09; 4 . 逻辑设计&#xff1a;怎…

p66 内网安全-域横向批量atschtasksimpacket

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 基本概念 DMZ区域&#xff1a;称为“隔离区”&#xff0c;也称‘’非军事化区/停火区…