Memory Analyzer(MAT)分析内存

简介: MAT是Memory Analyzer tool的缩写,是一款非常强大的内存分析工具,只需要打开采集的hprof文件即可开始对内存开始分析对比,一款“傻瓜式“的堆转储文件分析工具,谁都能学会。
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

在这里插入图片描述

一、导读

我们继续总结学习基础知识,温故知新。

二、概览

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.hprof

hprof-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学习专栏]

ddd

相关文章
|
14天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
49 1
|
8天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
18天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
128 9
|
23天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
26天前
|
Rust 编译器
|
1月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
46 2
|
1月前
|
SQL 安全 算法
ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
372 0
|
23天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
47 1