Memory Analyzer(MAT)分析内存

简介: MAT是Memory Analyzer tool的缩写,是一款非常强大的内存分析工具,只需要打开采集的hprof文件即可开始对内存开始分析对比,一款“傻瓜式“的堆转储文件分析工具,谁都能学会。

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

@TOC

在这里插入图片描述

一、导读

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

二、概览

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

相关文章
|
2天前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
29 2
|
2天前
|
存储 Arthas 监控
JVM工作原理与实战(三十):堆内存状况的对比分析
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了堆内存状况的对比分析、产生内存溢出的原因等内容。
15 0
|
2天前
|
缓存 Java 开发工具
OOM out of memory 内存溢出
OOM out of memory 内存溢出
16 1
|
2天前
|
缓存 Linux
linux性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
这些工具可以帮助你监视系统的内存使用情况、识别内存泄漏、找到高内存消耗的进程等。根据具体的问题和需求,你可以选择使用其中一个或多个工具来进行内存性能分析。注意,内存分析通常需要综合考虑多个指标和工具的输出,以便更好地理解系统的行为并采取相应的优化措施。
32 6
|
2天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
25 3
|
2天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
2天前
|
缓存 Java Android开发
安卓开发中的内存泄漏分析与优化策略
【4月更文挑战第27天】 在移动应用开发领域,性能优化始终是提升用户体验的关键因素之一。特别是对于安卓平台,由于设备的硬件配置差异较大,良好的内存管理对于保证应用流畅运行尤为重要。本文将深入探讨安卓开发中常见的内存泄漏问题,并提供一系列检测和解决内存泄漏的实用策略。通过对工具的使用、代码实践以及系统架构设计的多维度分析,旨在帮助开发者有效避免和处理内存泄漏,确保应用性能稳定。
|
2天前
|
Java
【Java基础】面向对象和内存分析
【Java基础】面向对象和内存分析
21 0
|
2天前
|
存储 Java Shell
Android系统 实现低内存白名单防LMK原理分析
Android系统 实现低内存白名单防LMK原理分析
43 0
|
2天前
|
缓存 NoSQL 中间件
redis内存溢出报错--OOM command not allowed when used memory > 'maxmemory'
该内容是关于Redis缓存服务器的使用指南。通过Xshell连接IP地址为25.218.153.193或206的主机,进入/data/iuap/middleware/redis-30001/bin目录,使用`redis-cli`连接到IP为206的30003端口。登录时需`auth yonyou*123`,可运行`info`和`info memory`查看状态,`flushall`清理缓存。在清理前,要备份/data/iuap/middleware/redis-30003/data/下的.aof和.rdb文件,利用tar命令打包并移至/tmp目录。