点击上方“方志朋”,选择“置顶或者星标”

你的关注意义重大!

阅读本文大概需要6分钟。

上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析。

MAT的欢迎页

03

使用MAT打开一个heap dump文件,解析完成后,默认会进入欢迎页,欢迎页里包含了一些常见的分析:最大内存占用分析、常见的分析动作、常用的分析报告、MAT使用教程等等。

我们看下下面这张图,可以看出MAT的主要结构和功能:

  1. 透视图(inspector):用于展示一个对象的详细信息,例如内存地址、加载器名称、包名、对象名称、对象所属的类的父类、对象所属的类的加载器对象、该对象的堆内存大小和保留大小,gc root信息。inspector窗口的下半部分是展示类的静态属性和值、对象的实例属性和值、对象所属的类的继承结构。

  2. Heap Dump History:用于列举最近分析过的文件

  3. 常用功能栏:从左到右依次是:概览、类直方图、支配树、OQL查询、线程视图、报告相关、详细功能。其中概览就是在刚解析完后展示的这个页面,详细功能按钮则是提供了一些更细致的分析能力。

  4. 概览中的饼图:该饼图用于展示retained size最大的对象

  5. 常用的分析动作:类直方图、支配树、按照类和包路径获取消耗资源最多的对象、重名类。

  6. 常见问题:Leak Suspects用于查找内存泄漏问题,Top Components负责分析占用堆内存超过整个堆内存1%大小的组件。

  7. Components Report:这个功能是一组功能的集合,用于分析某一类性的类的实例的问题,例如分析java.util.*开头的类的实例对象的一些使用情况,例如:重复字符串、空集合、集合的使用率、软引用的统计、finalizer的统计、Map集合的碰撞率等等。

MAT的基本功能

04

关于概览页面,我们再上一节已经进行过分析,这里不再赘述。我们在这一小节,将重点放在功能栏那一栏,即类直方图、支配树、OQL查询、线程视图等功能。

4.1

类直方图

堆直方图是从类的角度看哪些类及该类的实例对象占用着内存情况,默认是按照某个类的shallow heap大小从大到小排序。

Retained Heap这一列的值是空的,因为对于某个类的所有实例计算总的retained heap非常慢,因此使用者需要按需计算。

在直方图页面,可以选择某个条目右键进行分析,例如对所有类的对象做一些分析动作。

在直方图页面,还有一个重要的特性——可以选择一些其他维度进行分类分析,例如superclass、class loader、package。

如果选择按照package来分类,则可以看到下面这种视图

4.2

支配树

支配树可以用于查看heap dump中占用内存最大的对象。在支配树中,对于某一层的节点来说,如果它们的parent节点没有被其他对象引用了,那么这写节点都会被垃圾收集器回收。

支配树可以用来排查是哪些对象导致了其他对象无法被垃圾收集器回收,跟类直方图类似,支配树也从类加载器、package等角度来看。

4.3

OQL(对象查询语言)

MAT提供另一种类似SQL的对象查询语言——OQL,可以用类似SQL语句的方式查询heap dump中的对象。OQL和关系型数据库具备类似的数据模型:将某个类看作是一张表,将该类的实例对象看作是该表中的行,每个对象中的属性看作是构成行的列。

OQL语言的语法结构如下:

SELECT *
FROM [ INSTANCEOF ] <class name="name">
[ WHERE <filter-expression> ]
</filter-expression></class>

OQL编辑器分为两个区域:

  • 上半部分的区域用于输入查询语句

  • 下半部分的区域用于展示查询语句执行的结果

下图是查询当前堆里所有的String对象的语句和结果:

4.4

线程视图

通过上图中的那个按钮,可以查看线程视图,线程视图首先给出了在生成快照那个时刻,JVM中的Java线程对象列表。这个按钮的功能,等同于下图中的这个操作:

在线程视图这个表中,可以看到以下几个信息:线程对象的名字、线程名、线程对象占用的堆内存大小、线程对象的保留堆内存大小、线程的上下文加载器、是否为守护线程。

选中某个线程对象展开,可以看到线程的调用栈和每个栈的局部变量,通过查看线程的调用栈和局部变量的内存大小,可以找到在哪个调用栈里分配了大量的内存。

因此,heap dump和MAT不仅仅用于排查内存相关的问题,也有助于排查线程相关的问题。

4.5

问题分析

上图中的这个按钮,是MAT提供的一些常见的问题分析能力。因为这些问题特别常见,所以MAT就提供了对应的组合功能,帮用户快速定位常见问题。

  1. Heap Dump OverviewHeap Dump Overview就是整个堆的概括情况,例如:堆内存大小、对象个数、类的个数、类加载器的个数、GC root的个数、堆内存文件的格式、文件的创建时间、位置等信息。这个页面还开一个看一些系统属性、线程概览、Top内存耗费组件、类直方图等信息。

  2. Leak Suspects如下图所示,这个功能用于排查潜在的内存泄漏问题。

  3. Top Components针对那些占用堆内存超过整个堆内存1%大小的组件做一系列的分析,例如:Top Consumers、保留集合、潜在的内存浪费问题等其他问题。

    这一系列的分析,有很多层次,可以用下面这张思维导图理解:

4.6

对象查找

MAT支持根据对象的十六进制地址查找对象的outbound引用视图,如下图所示:

这个功能等同于在直方图中选中某个对象,然后右键列举该对象的outbound引用视图:

-更多文章-

MAT入门到精通(一)

为了效率,扎克伯格的26张PPT

分布式架构知识体系

Spring Cloud Consul 之Greenwich版本全攻略

-关注我-

看完了,帮我点个“好看”鸭

点鸭点鸭

↓↓↓↓

MAT入门到精通(二)相关推荐

  1. Kali Linux 从入门到精通(二)-安装

    Kali Linux 从入门到精通(二)-安装 Kail Linux 安装 持久加密USB安装-1 LUSK:Linux Unified Key Setup 磁盘分区加密规范 不依赖与操作系统的磁盘级 ...

  2. Mybatis从入门到精通二(入门详解)

    Mybatis从入门到精通二(想学Mybatis,看了这一篇你就不需要其他的了) 本课程分为两天第一天的请参考: https://blog.csdn.net/weixin_43564627/artic ...

  3. java从入门到精通二十四(三层架构完成增删改查)

    java从入门到精通二十四(三层架构完成增删改查) 前言 环境准备 创建web项目结构 导入依赖和配置文件 创建层次模型 实现查询 实现添加 实现修改 完成删除 做一个用户登录验证 会话技术 cook ...

  4. java从入门到精通二十三(Servlet)

    java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...

  5. Tensorflow系列 | Tensorflow从入门到精通(二):附代码实战

    作者 | AI小昕 编辑 | 安可 [导读]:本文讲了Tensorflow从入门到精通.欢迎大家点击上方蓝字关注我们的公众号:深度学习与计算机视觉. Tensor介绍 Tensor(张量)是Tenso ...

  6. MyBatis从入门到精通(二):MyBatis XML方式的基本用法之Select

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 明确需求 书中提到的需求是一个基 ...

  7. 微信公众平台从入门到精通二

    第二章  微信公众平台后台介绍 一.微信公众平台后台欢迎页面 登陆公众平台首先进入的就是欢迎页,跟大部分CMS后台一样,这里会提供的是公众账号的一些运营数据 例如:欢迎你,公众平台教程的页面,里面有: ...

  8. 彻底了解DVD:从入门到精通(二)[转]

    第五章 拿什么来看DVD? 前文探讨了DVD光盘片的相关常识,本章聊一聊DVD的周边设备. DVD的周边设备无外乎音频设备(声音)和视频设备(显示).这章内容涉及很多,从音响到电视到DVD机,凡是与D ...

  9. python机器学入门到精通(二)

    讲到机器学习,是离不开各种工具库的,特别是pandas.今天我们就来了解一下pandas的一些基础知识. [本篇所有代码均在jupyter上面运行] 初识pandas pandas是python an ...

最新文章

  1. break、continue和return的使用
  2. 展示前一阵子做的小熊!
  3. MacOS中Nginx的安装「借助Homebrew」
  4. LeetCode LCP 12. 小张刷题计划(二分查找)
  5. 通向财务自由之路07_利用方案设法启动你的系统
  6. Python 机器学习:多元线性回归
  7. 蓝牙耳机连接电脑,提示无法安装驱动程序
  8. Android使用keytool-importkeypair生成系统签名
  9. ajax原生详解,原生Ajax详解
  10. 计算机二级等级考试ms office用什么软件练习好?
  11. 安全领域知识图谱建设与典型应用场景
  12. ps图层混合模式的含义
  13. ZZULIOJ-1012,求绝对值(Java)
  14. 多人聊天功能代码php,PHP+swoole实现简单多人在线聊天群发效果
  15. 大学生计算机装机配置作业,不愧是计算机专业的大学生,自己写配置来装机,万元电脑真霸气...
  16. 魔兽转移账号的服务器,《魔兽世界》那些区能进行免费角色转移服务 安苏、死亡之翼服务器免费角色转移服务现已开放...
  17. Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Host not found
  18. android 选择视频文件 上传到后台服务器
  19. jQuery.artDialog用法(弹窗)
  20. 自动化专业考研可以计算机吗,自动化专业考研可以选择什么专业?

热门文章

  1. 洛谷P2380 狗哥采矿
  2. Codeforces Round #409 (Div. 2) C Voltage Keepsake(二分)
  3. 在Windows上搭建Git Server
  4. Chapter 0: 引论
  5. 【第11周复盘】小朋友们 100% 闯关成功!
  6. 【C#串口编程计划】如何避免关闭串口时软件死锁
  7. 基于opencv的简单视频处理类示例
  8. MySQL之父等国际数据库掌门人齐聚,1024 程序员节全体大会重磅官宣!
  9. 苹果新算法已混进 iOS 14.3!CSAM 检测技术再遭网友争议
  10. 太任性!17 岁少年买不到回国机票,因“泄愤”攻击航司系统,被判刑 4 年