从LeakCanary看内存快照解析

news2024/12/23 5:13:28

在从LeakCanary看内存快照生成一节中,我们已经了解了hprof的生成,并且将生成的hprof文件通过Android Studio进行解析,确实发现了内存泄漏对象MainActivity,但是在实际开发中,要求开发者自己去手动pull hprof文件进行解析,相对而言,操作是比较麻烦的,我们期望能通过代码分析出内存泄漏对象的引用链以提示开发者。

在LeakCanary早起是通过HaHa库进行hprof文件解析的,随后在LeakCanary2.0之后迁移到Shark,使用Shark进行hprof文件的解析,接下来我们看下Shark在LeakCanary中的实现。

Shark的组成

在LeakCanary中Shark主要由shark,shark-android,shark-graph,shark-hprof,shark-log五个模块组成,如下图所示:

image-20230819121725739

其中各个模块作用如下:

  • shark-hprof:主要用于读写hprof文件中的Record数据
  • shark-graph:主要用于生成堆对象的关系图
  • shark:主要用于生成hprof文件的解析报告
  • shark-android:生成Android平台定制的堆对象分析类
  • shark-log:日志打印的包装工具模块

hprof文件的生成

leakcanary-shark.drawio

LeakCanary中hprof文件的生成流程如上图,总体经历DumpingHeap。dumpHeap和HeapDump三个阶段,在HeadDump后hprof文件生成完成,调用AndroidDebugHeapAnalyzer解析hprof文件。

hprof文件解析

hprof文件解析流程如下图所示:

LeakCanary Shark parse hprof files

解析文件头

从上面图片可以看到解析文件头部分实现在HprofHeader类中,代码实现如下:

image-20230819165531962

解析Records数据区

leakcanary parse records process

感兴趣的同学可以参考看下源码,需要注意的是在这里readRecords前后调用了两次,第一遍收集class,instance,object array和primitive array的数量,第二遍才开始读取相关的结构信息。

查找泄漏对象

从前面知道我们的疑似泄漏对象都保存在KeyedWeakReference中,那么就可以通过全限定类名查找到所有的KeyedWeakReference对象,该对象中的referent成员就是泄漏对象id,最终通过这种形式就可以收集到所有的泄漏对象。

结合内存泄漏一文可知,泄漏对象作为图的叶子结点,在逐步递归向上查找,查找到GC Root后,也就建立了泄漏对象的GC Root Path,随后将所有泄漏对象的GC Root Path去重,即可展示了。

LeakCanary整体流程

leakcanary process.drawio

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/950663.html

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

相关文章

应急物资管理系统|智物资DW-S300提升应急响应能力

项目背景 智慧应急物资管理系统(智装备DW-S300)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本项目采用东识智慧应急物资管理…

ubuntu系统安装tensorRT-8.6.1版本(2023-8月最新版)

目录 前言pip安装可能出现的报错: tar.gz安装 前言 看了无数教程和b站视频,啊啊啊啊啊啊啊啊啊啊啊tensorRT要我狗命啊。我要写全网tensorRT最全的博客!!! 总体来说成功安装方式有两种,pip安装和tar.gz安装(其实官网安装方式居多…

d3dx9_29.dll丢失如何修复?dll修复工具下载方法

大家好!今天,我将为大家介绍一个与我们日常生活息息相关的话题——电脑d3dx9_29.dll丢失的6种修复方法。作为一名计算机专业的学生,我深知这个文件对我们电脑运行的重要性。在接下来的时间里,我将带领大家了解d3dx9_29.dll的作用、…

C#关于WebService中File.Exists()处理远程路径的异常记录

目录 前言方案一打开网站对应的程序池的高级设置按下图步骤设置凭据重启网站若方案一未能解决,请继续尝试方案二👇 方案二从控制面板进入到 凭据管理器为windows凭据添加凭据点击**Windows凭据**,并点击**添加Windows凭据**键入远程路径的地址…

Java之API详解之Biginteger类的详解

6 BigInteger类 6.1 引入 平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648 ~ 2147483647。如果数字过大,我们可以使用long类型,但是如果long类型也表示不下怎么办呢? 就需要用…

DC-DC 升压电路、 升压模块原理

一、什么是 DC-DC 转换器? DC-DC 转换器是一种电力电子电路,可有效地将直流电从一个电压转换为另一个电压。 DC-DC 转换器在现代电子产品中扮演着不可或缺的角色。这是因为与线性稳压器相比,它们具有多项优势。尤其是线性稳压器会散发大量热量…

全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”

糖尿病是全球高发慢性病中患病人数增长最快的疾病,是导致心血管疾病、失明、肾衰竭以及截肢等重大疾病的主要病因之一。目前中国有近1.4亿成人糖尿病患者,科学的血糖监测和健康管理对于糖尿病患者来说至关重要。 在9月1日全民健康生活方式行动日前夕&am…

Shell编程之运算符

目录 算数运算符 关系运算符 文件运算符 逻辑运算符 算数运算符 注意: 原生bash不支持简单的数学运算,但是可以通过其他命令来实现, 例如 expr 常用算数运算符 加-减*乘/除%取余 示例如下: A2 B3 expr $[$A$B] expr $[$A-$…

C语言的数据类型简介

一、基本类型 (1)六种基本类型 **字符串常量和字符常量的不同 1)‘a’为字符常量,”a”为字符串常量 2)每个字符串的结尾,编译器会自动添加一个结束标志位‘\0’ “a”包含两个字符’a’和’\0’ &#x…

FPGA优质开源项目 – UDP万兆光纤以太网通信

本文开源一个FPGA项目:UDP万兆光通信。该项目实现了万兆光纤以太网数据回环传输功能。Vivado工程代码结构和之前开源的《UDP RGMII千兆以太网》类似,只不过万兆以太网是调用了Xilinx的10G Ethernet Subsystem IP核实现。 下面围绕该IP核的使用、用户接口…

Qt6.5安装教程——国内源

为什么离线包没了? Qt6开始非商业授权下,不再提供离线安装方式的exe,但源码安装费时费力,所以推荐安装方式已经为在线组件安装方式,包括vs2022、Qt在线安装工具已经成为开发工具新的安装趋势。 Qt是不是要放弃开源&…

服务器日志出现大量NTLM(NT LAN Manager)攻击

日志名称:Security 来源: Microsoft-Windows-Security-Auditing 日期: 2023/8/30 20:57:40 事件 ID:4625 任务类别:登录 级别: 信息 关键字: 审核失败 用户: 暂缺 计算机: WIN-QBJ3ORTR0CF 描述: 帐户登录失败。 主题: 安全 ID:NULL SID 帐户名:- 帐户域:- …

【软考】系统集成项目管理工程师(二)信息系统服务管理【2分】

一、信息技术服务标准 1、组成要素 组成要素描述人员提供IT服务所需的人员及其知识、经验和技能要求【正确选人】流程提供IT服务时,合理利用必要的资源,将输入转化为输出的一组相互关联和结构化的活动【正确做事】技术交付满足质量要求的IT服务应使用的…

搭建个人备忘录中心服务memos、轻量级笔记服务

目录 一、源码 二、官网 三、搭建 四、使用 一、源码 GitHub - usememos/memos: A privacy-first, lightweight note-taking service. Easily capture and share your great thoughts. 二、官网 memos - Easily capture and share your great thoughts 三、搭建 docke…

js原生Unicode转中文

下面这个是一串正常的url https://editor.csdn.net/md?not_checkout10&spm1001.201001.9739&articleId27834274872转码过的字符串 https://editor.csdn.net/md?not_checkout1%26spm1001.2014.3001.9739%26articleid132576228上面这个代码如何再转回去 js通过decod…

springBoot--终

目录 Web定制SpringMVC定制某些mvc配置定制mvc核心组件完全自定义mvc 静态资源静态资源映射静态资源缓存示例自定义静态资源规则配置方式代码方式 欢迎页Favicon(网站图标)路径匹配策略内容协商制定返回json类型数据制定返回xml类型数据制定返回自定义类…

layui框架学习(43:文件上传模块-下)

上一篇文章介绍文件上传模块使用示例时介绍了done和error事件,这两个事件是在文件上传成功(原文:在上传接口请求完毕后触发,但文件不一定是上传成功的)及上传失败(原文:请求上传出现异常&#x…

一篇文章带你快速入门使用Git

文章目录 前言一、什么是版本控制二、Git与SVN的主要区别三、下载及使用1.安装2.启动Git3.常用的Linux命令4.Git配置 四、Git基本理论1.三个区域2.工作流程 五、Git项目搭建1.创建工作目录与常用指令2.本地仓库搭建3.克隆远程仓库 六、Git文件操作1.文件的四种状态2.查看文件状…

ElasticSearch最全详细使用教程:入门、索引管理、映射详解

导读:本文介绍了ElasticSearch的必备知识:从入门、索引管理到映射详解。 一、快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状态值说明 Green - eve…

JavaScript基础语法01——初识JavaScript

哈喽,大家好,我是雷工! 最近有项目用到KingFusion软件,由于KingFusion是B/S架构的客户端组态软件,因此在学习KingFusion产品时会涉及许多前端的知识。 像JavaScript语言就是需要用的,俗话说:活到…