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

相关文章
|
5月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
442 3
|
1月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
106 1
|
7月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
623 6
|
4月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
249 4
AI代理内存消耗过大?9种优化策略对比分析
|
6月前
|
Arthas 监控 Java
Arthas mc(Memory Compiler/内存编译器 )
Arthas mc(Memory Compiler/内存编译器 )
217 6
|
8月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
8月前
|
Java 编译器 Go
go的内存逃逸分析
内存逃逸分析是Go编译器在编译期间根据变量的类型和作用域,确定变量分配在堆上还是栈上的过程。如果变量需要分配在堆上,则称作内存逃逸。Go语言有自动内存管理(GC),开发者无需手动释放内存,但编译器需准确分配内存以优化性能。常见的内存逃逸场景包括返回局部变量的指针、使用`interface{}`动态类型、栈空间不足和闭包等。内存逃逸会影响性能,因为操作堆比栈慢,且增加GC压力。合理使用内存逃逸分析工具(如`-gcflags=-m`)有助于编写高效代码。
174 2
|
12月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
413 1
|
11月前
|
存储 缓存 数据安全/隐私保护
DMA(Direct Memory Access):直接内存访问
DMA(Direct Memory Access)是一种允许外设直接与内存进行数据传输的技术,无需 CPU 干预。它通过减轻 CPU 负担、提高数据传输效率来提升系统性能。DMA 的工作模式包括直接模式和 FIFO 模式,数据传输方式有单字传送和块传送,寻址模式有增量寻址和非增量寻址。通过缓存一致性协议、同步机制、数据校验和合理的内存管理,DMA 确保了数据在内存中的一致性和完整性。
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1604 0

热门文章

最新文章

下一篇
oss云网关配置