Memory Analyzer(MAT)分析内存
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。
目录
- 一、导读
- 二、概览
- 三、 使用
- 3.1 hprof 文件准备
- 3.1.1 Android sutdio Memory Profiler
- 3.1.2 adb shell
- 3.1.3 通过代码
- 3.2视图右键菜单功能
- 3.2.1 List objects
- 3.2.2 Show objects by class
- 3.2.3 Path To GC Roots
- 3.2.4 Merge Shortest Pahts to GC Roots
- 3.2.5 Java Basics
- 3.2.6 Java Collections
- 3.2.7 Leak Identification
- 3.2.8 Show Retained Set
- 3.2.9 Copy
- 3.2.10 Search Queries ...
- 3.2.11 Calculate Minimum Retained Size(quick approx.)
- 3.2.12 Calculate Precise Retained Size
- 3.2.13 Columns...
- 3.2.14 Immidiate Dominators
- 3.3 文件分析
- 3.3.1 OQL
- 3.3.2 Histogram(直方图)
- 3.3.3 Dominator Tree(支配树)
- 3.3.4 Top Consumers
- 3.3.4 Leak Suspects
- 3.3.5 Unreachable objects Histogram
- 四、 推荐阅读
一、导读
我们继续总结学习基础知识,温故知新。
二、概览
MAT是Memory Analyzer tool的缩写,是一款非常强大的内存分析工具,只需要打开采集的hprof文件即可开始对内存开始分析对比,一款“傻瓜式“的堆转储文件分析工具,谁都能学会。
下载地址:
三、 使用
3.1 hprof 文件准备
3.1.1 Android sutdio Memory Profiler
具体参考另一篇博文 Memory Profiler
Memory Profiler 是 Android Profiler 中的一个组件,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄露和内存抖动。
它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。
Memory Profiler我们主要用于识别内存泄漏、抖动 ,提供捕获堆转储、强制GC、跟踪内存分配
通过Memory Profiler 保存的堆转储文件,需要进行一次转换才能在MAT中打开。
hprof-conv heap-original.hprof heap-converted.hprofhprof-conv是 android sdk 工具,目录\Sdk\platform-tools
3.1.2 adb shell
adb shell am dumpheap [options] process file具体选项包括:--user [user_id | current]:提供进程名称时,指定要转储的进程的用户。如果未指定,则使用当前用户。
-n:转储原生堆,而非托管堆。
官网
3.1.3 通过代码
使用快手的koom 开源库dump hprof文件,这是一个线上内存监控方案
KOOM
当然还有其他方式,大家可自行尝试。
3.2视图右键菜单功能
3.2.1 List objects
将所有的对象都展示出来
- with incoming references 表示的是当前查看的对象,被外部应用,即所有引用该对象的对象,就是被哪个类引用
- with outGoing references 表示的是当前对象,引用了外部对象,即该对象引用的其他对象, 我引用了哪些类。
3.2.2 Show objects by class
Show objects by class会将它们统一归类
- by outgoing references:查看这个对象类型持有的外部对象引用
- by incoming references:查看这个对象类型被哪些外部对象引用
3.2.3 Path To GC Roots
过滤出该 对象 至 GC Roots 的一条最短引用链路。
常用来分析内存泄漏。
3.2.4 Merge Shortest Pahts to GC Roots
过滤出一条 GC Roots 到 该对象 的一条最短引用链。
- with all references
- exclude weak references
- exclude soft references
- exclude phantom references
- exclude weak/soft references:查看这个对象的GC Root,不含弱引用和软引用所有的引用.
- exclude phantom/soft references
- exclude phantom/weak references
- exclude all phantom/weak/soft etc. references , :查看这个对象的GC Root,不包含虚、弱引用、软引用,剩下的就是强引用。从GC上说,除了强引用外,其他的引用在JVM需要的情况下是都可以 被GC掉的,如果一个对象始终无法被GC,就是因为强引用的存在,从而导致在GC的过程中一直得不到回收,因此就内存溢出了。
- exclude custom field…
3.2.5 Java Basics
- References
- Class Loader Explorer 查看class loader相关的特性
- Customized Retained Set
- Find Strings
- Group By Value
- Open In Dominator Tree
- Show As Histogram
- Thread Details 展示该实例所在的线程一些属性内容
- Thread Overview and Stacks
3.2.6 Java Collections
- Array Fill Ratio
- Arrays Grouped By Size
- Collection Fill Ratio
- Collection Grouped By Size
- Hash Entries
- Map Collision Ratio
- Primitive Arrays With a Constant Value
3.2.7 Leak Identification
- Component Report
- Top Consumers
3.2.8 Show Retained Set
显示对象在Dominator Tree中的子节点集合
3.2.9 Copy
复制
3.2.10 Search Queries …
3.2.11 Calculate Minimum Retained Size(quick approx.)
3.2.12 Calculate Precise Retained Size
3.2.13 Columns…
3.2.14 Immidiate Dominators
找出对象在Dominator Tree中的父节点
3.3 文件分析
当我们获取到HPROF文件后,之间选择打开即可,打开后会呈现以下界面
- 小技巧
Shallow Size和Retained size 默认是以byte为单位的,若要显示地让单位展示出来,可以这样设置
window -> preferences -> memory analyzer -> smart
3.3.1 OQL
查询工具,常常用于定位内存泄漏
语法结构
SELECT * FROM [ INSTANCEOF ] <class name="name"> [ WHERE <filter-expression> ] </filter-expression></class>eg:select * from instanceof android.app.Activity
- OBJECTS 通过对象查询
后面可以是对象,也可以是地址
SELECT * FROM OBJECTS xyz
当然也可以进行复杂的查询
—>>> 官网OQL语法
3.3.2 Histogram(直方图)
展示所有分配类实例个数,以及占用内存的大小, 常用于查看是否泄漏,及否有异常分配。
列出内存中的对象,对象的个数以及大小, Histogram是站在类的角度上去看,展示的是每个class对象的个数,大小等
- Objects:对象实例的个数。
- Regex :筛选过滤,可以进行模糊匹配,例如输入activity,
- Classe Name:类名。
- Shallow Heap:对象自身占用的内存大小,不包括它引用的对象。如果是数组类型的对象,它的大小是数组元素的类型和数组长度决定。如果是非数组类型的对象,它的大小由其成员变量的数量和类型决定。
- Retained Heap:一个对象的Retained Set所包含对象所占内存的总大小。换句话说,Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存。
3.3.3 Dominator Tree(支配树)
展示出每个实例对象的内存大小及在总内存中的占比以及其详细引用。
Dominator tree是站在对象(实例)的角度上去看,可以更方便的看出其引用关系。
- Regex :筛选过滤,可以进行模糊匹配,例如输入activity,
- Classe Name:类名。
- Shallow Heap:对象自身占用的内存大小,不包括它引用的对象。如果是数组类型的对象,它的大小是数组元素的类型和数组长度决定。如果是非数组类型的对象,它的大小由其成员变量的数量和类型决定。
- Retained Heap:一个对象的Retained Set所包含对象所占内存的总大小。换句话说,Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存。
- Percentage:内存占比
会展示出每个实例对象的 Shallow Head 与 Retained Head 以及 Retained Head在总内存中的占比,该页面方便我们观察各个对象在内存中大小与占比,以及其详细引用,评估该对象占用大小是否在合理范围内
这个视图的右边大区域可以看到对象的依赖关系,选中某个对象以后可以在左边小窗口查看对象的一些属性。如果属性的值是一些内存地址你还可以点击工具栏的搜索按钮来搜索具体的对象信息。在进行具体分析的时候MAT只是起了帮助你进行分析的工具的功能,OOM问题分析没有固定方法和准则。只能发挥你敏锐的洞察力,结合源代码,对内存中的对象进行分析从而找到代码中的BUG.
3.3.4 Top Consumers
以图形的形式展示内存,根据类名和包名列出开销最大的对象
3.3.4 Leak Suspects
3.3.5 Unreachable objects Histogram
可被回收的对象,但是仍然在内存中
四、 推荐阅读
Java 专栏
SQL 专栏
数据结构与算法
Android学习专栏
相关文章:

Memory Analyzer(MAT)分析内存
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、 使用3.1 hprof 文件准备3.1.1 Android sutdi…...
计算机网络面试题
目录 OSI 的五层模型分别是?各自的功能是什么? 应用层 传输层 网络层 数据链路层 物理层 OSI 的七层模型分别是? TCP连接的建立 三次握手中客户端和服务端是什么状态 为什么是三次,不是两次? 四次…...

【LeetCode75】第三十题 奇偶链表
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个链表,让我们把奇索引和偶索引的节点区分开来 ,参考示例给出的图我们应该就能很清晰地知道题目是什么…...

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)
docker 学习–03 环境安装(本人使用的win10 Linux也是在win10下模拟) docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 文章目录 docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)[TOC](文章目录) 1. wi…...

【代码质量】认知复杂度(COGNITIVE COMPLEXITY)一种衡量可理解性的新方法
白皮书地址 摘要:圈复杂度最初是作为“可测试性和模块控制流的“可维护性”。虽然它擅长于衡量前者,但它的数学模型不能产生一个令人满意的值来衡量后者。本文描述一种打破数学度量模型的新度量模型来评估代码,以弥补圈复杂度的缺点…...
什么是JavaScript中的内存泄漏和如何避免内存泄漏?
1、什么是JavaScript中的内存泄漏和如何避免内存泄漏? JavaScript中的内存泄漏是指在程序运行过程中,一些不再使用的对象或数据仍然存在于内存中,导致内存无法释放,最终导致内存耗尽。 为了避免内存泄漏,可以采取以下…...

安全头响应头(三)X-Content-Type-Options
一 X-Content-Type-Options响应头 说明:先写个框架,后续补充 思考:请求类型是 "style" 和 "script" 是什么意思? script标签 style StyleSheet JavaScript MIME type 文件扩展和Content-Type的映射关系 场景: 一个…...
13 计算机视觉-代码详解
13.2 微调 为了防止在训练集上过拟合,有两种办法,第一种是扩大训练集数量,但是需要大量的成本;第二种就是应用迁移学习,将源数据学习到的知识迁移到目标数据集,即在把在源数据训练好的参数和模型ÿ…...

jupyter打开ipynb后,还没有运行cell,反复报错
今天遇到了一个比较奇怪的问题: 这个原因是当前目录下有一个code.py的文件,一旦打开ipynb,就是先执行code.py,而且遇到报错,还会反复执行,导致内核崩溃。...

一台阿里云服务器怎么部署多个网站?以CentOS系统为例
本文阿里云百科介绍如何在CentOS 7系统的ECS实例上使用Nginx搭建多个Web站点。本教程适用于熟悉Linux操作系统,希望合理利用资源、统一管理站点以提高运维效率的用户。比如,您可以在一台云服务器上配置多个不同分类的博客平台或者搭建多个Web站点实现复杂…...

history记录日期时间和日志记录操作
history命令能查看到操作日期和时间的配置方法: 1)在/etc/profile文件中添加一行: export HISTTIMEFORMAT"%F %T whoami " 2)保存后,执行加载命令: source /etc/profile 3)然后检…...
RocketMQ 单机源码部署 自定义配置文件和端口以及acl权限配置解析
思路 1、我们首先配置完 namesrv和broker和acl认证的配置文件,然后直接使用-c指定配置文件来启动程序,就会非常明了,用户名密码要大于6,第一个用户我测试着不知道为什么始终有最高权限,大家尽量不要吧第一个用户给别人…...

NuGet控制台命令初步使用
查看所有安装的包, 查找包,提示Nuget版本低;安装一个更高版本; 查看所有安装的包, 查找名字包含某字符串的包, 查找名字包含某字符串的包, 安装,使用-version指定版本,可…...

2023年国赛数学建模思路 - 案例:FPTree-频繁模式树算法
文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法,…...
Positive Technologies:有针对性的攻击占非洲所有攻击的 68%
网络犯罪分子最常攻击的是非洲的金融公司和电信公司 Positive Technologies 分析了 2022–2023 年非洲遇到的各种网络安全威胁,并在圣彼得堡举行的第二届俄罗斯—非洲峰会上介绍了研究结果。根据我们的专家的介绍,非洲金融部门受到的网络攻击最多&#…...

Flink CDC系列之:TiDB CDC 导入 Elasticsearch
Flink CDC系列之:TiDB CDC 导入 Elasticsearch 一、通过docker 来启动 TiDB 集群二、下载 Flink 和所需要的依赖包三、在TiDB数据库中创建表和准备数据四、启动Flink 集群,再启动 SQL CLI五、在 Flink SQL CLI 中使用 Flink DDL 创建表六、Kibana查看Ela…...

未来混合动力汽车的发展:技术探索与前景展望
随着环境保护意识的增强和对能源消耗的关注,混合动力汽车成为了汽车行业的研发热点。混合动力汽车融合了传统燃油动力和电力动力系统,通过优化能源利用效率,既降低了燃油消耗和排放,又提供了更长的续航里程。本文将探讨混合动力汽…...

C进阶(2/7)前篇——指针进阶
前言:本文章讲解部分指针进阶内容。后续继续更新。 文章重点: 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 目录 前言:本文章讲解部分指针进阶内容。后续继续更新。 指针初阶了解: 1.字符指针 1.1一道有关于字…...

C 内存分配器 mimalloc
有论文 … … https://www.microsoft.com/en-us/research/publication/mimalloc-free-list-sharding-in-action/ 可以减少内存碎片,微软研究院2019 年开源出的内存分配器 代码,适配linux...
leetcode做题笔记74搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 思…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...