JVM系列(二十八) JVM调优实战-MAT内存分析 Overview概览图

2,307 阅读4分钟

MAT内存分析 Overview概览图

前面我们讲解了MAT内存分析工具,打开Dump文件后,找到Leak Suspects内存泄漏检测点,在它的左侧有一个Overview概率图信息,本文我们主要讲解以下概率图可以帮我们看哪些内容

image.png

1.Overview 概览图

下面我们看下概览图,都包含哪些东西,大致分为三大块

  1. Details 大小,类信息,及不可达对象分析

image.png

  1. biggest object by retained size(占用内存最大的几个对象) 及Remainder 正常内存对象信息

image.png

  1. Actions 大对象排序信息,Reports 内存泄漏信息, Step by step 分析相同根或者类加载器信息 image.png

2.Detail 分析

下面我们看下Detail信息

  • Size: 68.2 MB 总大小68.2M
  • Classes: 6.1k 类数量6.1K
  • Objects: 156.8k 对象数量156.8K
  • Class Loader: 30 类加载器30种
  • Unreachable Objects Histogram 不可达的大对象信息,其实这部分就是应该被回收的对象,但是现在仍然存活在内存中,这部分是要重点看下

下面我们看下 不可达的大对象信息有什么? 可以看到不可达对象中存在

  • 很多的类信息Class
  • 这些对象的数目 信息 objects,
  • 对象占用的浅堆 Shallow Heap 对象本身的大小信息

image.png

3. Biggest object by retained size

biggest object by retained size中有哪些信息?

  • 总大小 total 68.2M
  • Remainder Size 正常的内存对象50.2M
  • 剩余的就是不正常的内存,也就是可能泄漏的内存 ,很多线程,每个线程2M

image.png

4.Actions 具体的操作信息

4.1 Histogram: Lists number of instances per class 大对象信息

点击 Histogram ,我们可以看到内存中的对象信息

image.png

  • 对象类型 ClassName
  • 具体的对象的数量 Objects
  • 对象浅堆 Shallow Heap 对象本身大小
  • 对象深堆 Retained Heap 对象回收可回收大小

我们找一个最大的 对象,分析下 点击 Byte[] , 点击List objects, 点击 use incoming 分析入对象,被谁引用

image.png

点击 Retained Head 进行排序, 就可以得到 最大的哪些对象信息

image.png

然后找 GC ROOT根信息,exclude all 链接信息, 就能得到线程信息

image.png

然后展开线程 image.png

看下线程为什么这么大,到底它引用了什么东西

image.png

然后找 自己熟悉的代码, 自己写的类信息,看能否发现问题

image.png

发现是 TestController 的 test方法出的问题, 定位到该问题

4.2 Dominatro Tree 对象的支配树

点击对象支配树,可以看到 对象的类信息,深堆,浅堆,内存占比Percentage信息

image.png

同样的思路, 点击 大对象, 查看Outgoing 信息

image.png

展开,发现定位问题 TestController的test方法

image.png

4.3 Top Consumers 大对象信息排序

在TopConsumers 中,我们可以看到 整个内存的分布信息,并且内存中的每一块,每一个部分占比都非常清晰,这块的内容 我们放到内存泄漏部分去讲解, 本文我们先有个大概的了解

  • 左侧饼图和右侧占比 一一对应
  • 大对象类信息 Dominator Classes 统计
  • 大对象包信息 Diminator Packages 统计

顶部的消费者:打印最昂贵的对象按类和包

image.png

4.4 Duplicate Classes 重复的类

重复的类是检测由多个类加载器加载的类信息

image.png

5. REPORTS 报告信息

  • Leak Suspects:重点关注,就是内存泄漏的排查点, 包括泄漏嫌疑人和系统概述
  • Top Components:列表报告成分大于百分之1的总的堆

内存泄漏的排查点 Leak Suspects 如下 image.png

Top Components 如下 image.png

6.Step By Step

  • Component Report: Analyze objects which belong to a common root package or class loader
  • 部分报告:分析对象,属于一个共同的根包或类加载器

这块意义不大,不需要关注

image.png


本文,我们讲解了MAT Overview的概览图信息,包括概览图中下面的 Histogram大对象信息, DominatorTree 对象支配树信息, Leak Suspects 内存泄漏排查点等等功能,并且利用大对象,我们已经定位到了问题,这些都是我们在分析内存泄漏的时候的利器,下一篇我们主要讲解内存泄漏排查点的功能