Memory Analyzer(MAT)分析内存

关于作者: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

猜你喜欢

转载自blog.csdn.net/fumeidonga/article/details/132297263
今日推荐