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

ddd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot学习笔记】04. Thymeleaf模板引擎

模板引擎 所有的html元素都可以被thymeleaf替换接管 th:元素名 templates下的只能通过Controller来跳转&#xff0c;templates前后端分离&#xff0c;需要模板引擎thymeleaf支持 模板引擎的作用就是我们来写一个页面模板&#xff0c;比如有些值呢&#xff0c;是动态的&#x…

cuda+anaconda+pytorch按照教程

首先安装显卡对应的CUDA版本&#xff0c;关键点在于区别显卡支持的CUDA最高版本和运行版本 1、查看当前显卡支持的最高版本&#xff0c;有两种方式&#xff1a; 1&#xff09;NVIDIA控制面板—>帮助—>系统信息—>组件—>NVCUDA.dll对应版本 请注意&#xff0c;12…

2023年国赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

项目:基于UDP的TFTP文件传输

1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再…

分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存

官方文档&#xff1a;https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲&#xff0c;Nginx可以在接收完整的响应后再将其发送给客户端&#xff0c;从而提高性能和效率…

照耀国产的星火,再度上新!

国产之光&#xff0c;星火闪耀 ⭐ 新时代的星火⭐ 多模态能力⭐ 图像生成与虚拟人视频生成⭐ 音频生成与OCR笔记收藏⭐ 助手模式更新⭐ 插件能力⭐ 代码能力⭐ 写在最后 ⭐ 新时代的星火 在这个快速变革的时代&#xff0c;人工智能正迅猛地催生着前所未有的革命。从医疗到金融…

【管理运筹学】第 5 章 | 整数规划 (1,问题提出与分支定界法)

文章目录 引言一、整数规划问题的提出1.1 整数规划的数学模型1.2 整数规划问题的求解 二、分支定界法2.1 分支与定界2.2 基本求解步骤&#xff08;一&#xff09;初始化&#xff08;二&#xff09;分支与分支树&#xff08;三&#xff09;定界与剪枝&#xff08;四&#xff09;…

SpringBoot之HandlerInterceptor拦截器的使用

&#x1f600;前言 本篇博文是关于拦截器-HandlerInterceptor的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

Linux 多进程

目录 0x01 linux中特殊的进程 0x02 进程的标识 0x03 创建子进程 0x01 linux中特殊的进程 0号进程&#xff1a;idle进程&#xff0c;系统启动加载的进程1号进程&#xff1a;systemd进程&#xff0c;系统初始化&#xff0c;是所有进程的祖先进程 init2号进程&#xff1a;kthre…

YOLOv5白皮书-第Y6周:模型改进

&#x1f4cc;本周任务&#xff1a;模型改进&#x1f4cc; 注&#xff1a;对yolov5l.yaml文件中的backbone模块和head模块进行改进。 任务结构图&#xff1a; YOLOv5s网络结构图: 原始模型代码&#xff1a; # YOLOv5 v6.0 backbone backbone:# [from, number, module, args]…

每日汇评:黄金在 200 日移动平均线附近似乎很脆弱,关注美国零售销售

1、金价预计将巩固其近期跌势&#xff0c;至 6 月初以来的最低水平&#xff1b; 2、对美联储再次加息的押注继续限制了贵金属的上涨&#xff1b; 3、金融市场现在期待美国零售销售报告带来一些有意义的推动&#xff1b; 周二金价难以获得任何有意义的牵引力&#xff0c;并在…

Mac RN环境搭建

IOS RN ios android原生环境搭建有时候是真恶心&#xff0c;电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限&#xff0c;执行失败。因…

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

OpenSSH 远程升级到 9.4p1

OpenSSH 远程升级到 9.4p1 文章目录 OpenSSH 远程升级到 9.4p1背景升级前提1. 升级 OpenSSL2. 安装并启用Telnet 升级OpenSSH 背景 最近的护网行动&#xff0c;被查出来了好几个关于OpenSSH 的漏洞。这是因为服务器系统安装后&#xff0c;直接使用了系统自带版本的OpenSSH &am…

2023-08-15 linux mipi 屏幕调试:有一个屏幕开机时候不显示,开机后按power 按键休眠唤醒就可以显示。原因是reset gpio 被复用

一、现象&#xff1a;今天更新了一个新版本的buildroot linux sdk &#xff0c;调试两个mipi 屏幕&#xff0c;这两个屏幕之前在其他的sdk都调好了的&#xff0c;所有直接把配置搬过来。但是有一个屏幕可以正常显示&#xff0c;有一个屏幕开机时候不显示&#xff0c;开机后按po…

CentOS防火墙操作:开启端口、开启、关闭、配置

一、基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firewalld 开机启用 &#xff1a; systemctl enable firewalld systemctl是…

C语言,结构体,结构体大小,

1、结构体&#xff1a; 用于存储不同数据类型的多个相关变量&#xff0c;从而形成一个具有独立性的组合数据类型。 结构体的声明&#xff1a; struct 结构体类型名{ 数据类型 成员1&#xff1b; 数据类型 成员2&#xff1b; 数据类型 成员3&#xff1b; ……… }&#xff1…

转行软件测试四个月学习,第一次面试经过分享

我是去年上半年从销售行业转行到测试的&#xff0c;从销售公司辞职之后选择去培训班培训软件测试&#xff0c;经历了四个月左右的培训&#xff0c;在培训班结课前两周就开始投简历了&#xff0c;在结课的时候顺利拿到了offer。在新的公司从事软件测试工作已经将近半年有余&…

深信服数据中心管理系统 XXE漏洞复现

0x01 产品简介 深信服数据中心管理系统DC为AC的外置数据中心&#xff0c;主要用于海量日志数据的异地扩展备份管理&#xff0c;多条件组合的高效查询&#xff0c;统计和趋势报表生成&#xff0c;设备运行状态监控等功能。 0x02 漏洞概述 深信服数据中心管理系统DC存在XML外部实…

WPS-0DAY-20230809的分析和利用复现

WPS-0DAY-20230809的分析和初步复现 一、漏洞学习1、本地复现环境过程 2、代码解析1.htmlexp.py 3、通过修改shellcode拿shell曲折的学习msf生成sc 二、疑点1、问题2、我的测试测试方法测试结果 一、漏洞学习 强调&#xff1a;以下内容仅供学习和测试&#xff0c;一切行为均在…