利用MAT分析JVM内存问题,从入门到精通(二)

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

3、欢迎页

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

咱们看下下面这张图,能够看出MAT的主要结构和功能: 数据库

MAT的窗口布局

  1. inspector:透视图,用于展现一个对象的详细信息,例如内存地址、加载器名称、包名、对象名称、对象所属的类的父类、对象所属的类的加载器对象、该对象的堆内存大小和保留大小,gc root信息。
  2. inspector窗口的下半部分是展现类的静态属性和值、对象的实例属性和值、对象所属的类的继承结构。
  3. Heap Dump History:用于列举最近分析过的文件
  4. 经常使用功能栏,从左到右依次是:概览、类直方图、支配树、OQL查询、线程视图、报告相关、详细功能。其中概览就是在刚解析完后展现的这个页面,详细功能按钮则是提供了一些更细致的分析能力。
  5. 概览中的饼图:该饼图用于展现retained size最大的对象
  6. 经常使用的分析动做:类直方图、支配树、按照类和包路径获取消耗资源最多的对象、重名类。
  7. 报告相关:Leak Suspects用于查找内存泄漏问题,以及系统概览
  8. Components Report:这个功能是一组功能的集合,用于分析某一类性的类的实例的问题,例如分析java.util.*开头的类的实例对象的一些使用状况,例如:重复字符串、空集合、集合的使用率、软引用的统计、finalizer的统计、Map集合的碰撞率等等。
    Component Report的功能

4、基本功能

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

4.1 类直方图

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

类直方图

Retained Heap这一列的值是空的,由于对于某个类的全部实例计算总的retained heap很是慢,所以使用者须要按需计算。 bash

retained size是按需计算

在直方图页面,能够选择某个条目右键进行分析,例如对全部类的对象作一些分析动做。编辑器

image.png

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

image.png

若是选择按照package来分类,则能够看到下面这种视图优化

image.png

4.2 支配树

支配树能够用于查看heap dump中占用内存最大的对象。在支配树中,对于某一层的节点来讲,若是它们的parent节点没有被其余对象引用了,那么这写节点都会被垃圾收集器回收。spa

支配树能够用来排查是哪些对象致使了其余对象没法被垃圾收集器回收,跟类直方图相似,支配树也从类加载器、package等角度来看。

[图片上传失败...(image-ec386f-1550075801691)]

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对象的语句和结果:

image.png

4.4 线程视图

image.png

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

image.png

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

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

image.png

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

4.5 问题分析

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

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

    image.png

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

    image.png

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

    image.png

这一系列的分析,有不少层次,能够用下面这张思惟导图理解:

image.png

4.6 对象查找

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

image.png

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

image.png


本号专一于后端技术、JVM问题排查和优化、Java面试题、我的成长和自我管理等主题,为读者提供一线开发者的工做和成长经验,期待你能在这里有所收获。

javaadu
相关文章
相关标签/搜索