详细介绍了Java内存分析工具MAT(Memory Analyzer Tool)的常见使用方法,MAT可以帮助Java程序员快速进行内存分析,定位问题。

MAT(Memory Analyzer Tool),一个基于Eclipse的跨平台的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它通过读取应用程序运行时由 Java 运行时环境生成的转储文件快照,可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

官网地址:https://www.eclipse.org/mat/。

Memory Analyzer 可以用来处理 HPROF 二进制 Heap Dump 文件 、 IBM 系统 dump 文件(经过处理后)、以及来自各个平台上的 IBM portable Heap Dump s (PHD) 文件。通过Memory Analyzer 能够直观的看到Heap Dump文件中的:

  1. 对象信息:类、成员变量、直接量以及引用值;
  2. 类信息 类加载器 、 名称 、 超类 、 静态成员;
  3. Garbage Collections Roots JVM 可达的对象;
  4. 线程栈以及本地变量 获取快照时的线程栈信息 以及局部变量的详细信息 。

文章目录

  • 1 下载MAT
  • 2 获取Dump文件
  • 3 编写错误程序
  • 4 转储Heap Dump
  • 4 使用MAT
    • 4.1 OverView概览视图
    • 4.2 Histogram直方图
      • 4.2.1 outgoing reference与incoming reference
    • 4.3 Dominator Tree支配树
    • 4.4 Thread Overview线程视图
    • 4.5 Leak Suspects泄露分析报告

1 下载MAT

官方下载地址:https://www.eclipse.org/mat/downloads.php。

下载完毕之后,解压,可以看到MemoryAnalyzer.exe文件,打开即可使用。

2 获取Dump文件

获取Heap Dump文件的方式有很多,通常是通过参数配置在特定的条件下触发堆转储,也可以通过工具来获取。常见命令的方式有如下两个:

  1. 启动时添加JVM参数-XX:+HeapDumpOnOutOfMemoryError,将会在发生系统OutOfMemoryError后自动转储一份HPROF二进制Heap Dump文件。
  2. 该配置会把快照保存在项目目录或者tomcat目录下,也可以通过 -XX:HeapDumpPath=/xxx/heapdump.hprof来显示指定路径。
  3. OnOutOfMemoryError参数还允许用户指定当出现OOM时,指定某个脚本来完成一些动作,比如自动重启tomcat-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/heapdump.hprof -XX:OnOutOfMemoryError="sh ~/restart.sh"
  4. 使用jmap参数,jmap -dump:[live,]format=b,file=<filename>,将会立即将生成堆转储快照到指定的位置指定的文件中。

3 编写错误程序

我们编写一个简单的代码,循环的创建UUID字符串拼接并添加到一个list中:

public class TestJvmOOM {public static void main(String[] args) {List<Object> list = new ArrayList<>();for (int i = 0; i < 1000000; i++) {String str = "";for (int j = 0; j < 100; j++) {str += UUID.randomUUID().toString();}list.add(str);}System.out.println("ok");}
}

4 转储Heap Dump

设置启动参数,最大内存为4m,并且自动转储Heap Dump:-Xms4m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError,IDEA这么设置:

运行程序之后很快抛出了OOM,并且自动生成了Heap Dump文件:

默认位置在项目目录下面:

下面开始分析!

4 使用MAT

双击MemoryAnalyzer.exe文件,打开:

点击File,Open Heap即可选择一个Heap Dump文件,我们选择刚才生成的文件。

选择打开的模式,我们选择第一个Leak Suspects Report模式,即用于分析内存泄漏,点击Finish即可打Heap Dump文件:

常见选项的含义:

  1. Leak Suspects Report:内存泄漏可疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集,最常用的模式
  2. Component Report: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等。
  3. Re-open previously run reports: 打开以前的运行报告;

4.1 OverView概览视图

Dump文件越大,打开的时间就越长,打开之后,OverView界面如下,Overview视图,显示了此份Dump文件的概要的信息,并展示了MAT常用的一些功能:

  1. Details:显示了一些统计信息,包括HeapDump的大小、类(Class)的数量、对象(Object)的数量、类加载器(Class Loader)的数量。
  2. Biggest Objects by Retained Size :以饼图的方式直观地显示了在dump中最大的几个对象,当鼠标光标移到某块区域的时候会在左边InspectorAttributes窗口中显示详细的信息,在区块上点击左键可以通过菜单获取更详细的信息。
  3. Actions :几种常用到的操作,包括Histogram、Dominator Tree、Top Consumers、Duplicate Classes
  4. Reports :列出了常用的报告信息,包括Leak SuspectsTop Components
  5. Step By Step :以向导的方式逐步的引导使用功能,包括Component Report

下面我们来看看其他常用的功能。

4.2 Histogram直方图

Histogram直方图,用于展示每个类型的实例的数量,以及 shallow size 和 retained size :

  1. shallow size:浅堆,代表了对象本身的内存占用,包括对象自身的内存占用,以及“为了引用”其他对象所占用的内存。
  2. 非数组类型的对象的 shallow heap=对象头+各成员变量大小之和+对齐填充。其中,各成员变量大小之和就是实例数据,如果存在继承的情况,需要包括父类成员变量
  3. 数组类型的对象的shallow heap=对象头+类型变量大小*数组长度+对齐填充,如果是引用类型,则是四字节或者八字节(64 位系统),如果是 boolean 类型,则是一个字节。这里类型变量大小*数组长度就是数组实例数据,强调是变量不实际是对象本身。
  4. Retained heap:深堆,一个统计结果,会循环计算引用的具体对象所占用的内存。但是深堆和“对象大小”有一点不同,深堆指的是一个对象被垃圾回收后,能够释放的内存大小,这些被释放的对象集合,叫做保留集(Retained Set)。

4.2.1 outgoing reference与incoming reference

当右键单击任何对象时,将看到下拉菜单,如果选择“ListObjects”菜单项,可以查看对象的outgoing reference(对象的引出)和incoming reference(对象的引入)。

Incomming Reference 指的是引用当前对象的对象,Outgoing Reference 指的是当前对象引用的对象。对象的incomming reference 保证对象处于 alive 从而免于被垃圾回收掉 ;Outgoing reference 则展示了对象内部的具体内容,有助于我们分析对象的属性 。

我们看看第一个最大的char[]的Incomming Reference:

可以看到,它们几乎都是被一个String对象的value属性引用的,实际上这个String就是我们拼接的UUID字符串。

4.3 Dominator Tree支配树

列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。

排在第一的最大的对象就是占用内存最多的对象,它在树中的子节点都是被该对象直接或间接引用的对象(这意味着当这个对象被回收的时候它的子节点对象也会被回收)。

一般定位OOM的时候,都是直接查看支配树的最大的对象,我们的Heap Dump中的支配树中,很明显ArrayList占用了最大的内存,里面的元素就是一个个拼接的UUID字符串,就是因为这个原因导致了OOM。

4.4 Thread Overview线程视图

点击上面的黄色齿轮,可以生成Heap Dump文件的时候线程视图Thread Overview,查看线程的运行情况,抛出的异常的分析。

我们的Heap Dump中的Thread Overview,结果如下,很明显OutOfMemoryError是由main线程抛出的:

4.5 Leak Suspects泄露分析报告

MAT会分析 Heap Dump 文件并检测内存泄漏的可能,比如一个或一组异常大的对象 。Leak Suspects用于生成内存泄漏嫌疑分析报告,非常有用,能够帮组我们快速的定位OOM的原因。

查看我们的Heap Dump中的Thread Overview,结果如下,如果此前的几项你还不确定OOM的原因的话,那么这里可以说直接告诉你原因了:

可以看到,有66.79%的内存由Object[]数组占有,所以比较可疑,这是非常有可能出现内存溢出的。点击Details查看详情:

可以看到集合中存储了大量的UUID字符串。实际上这里已经告诉我们是不是因此导致的内存溢出了,我们在details详情的最下面可以看到:

就是这个大对象数组(list集合使用数组存放的元素),因为需要分配连续的内存,而内存不足导致的OOM。

至此,分析完毕!

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用相关推荐

  1. java oql_深入理解java虚拟机(八):java内存分析工具-MAT和OQL

    以下内容翻译自MAT帮助文档. 一.Class Histogram Class Histogram shows the classes found in the snapshot, the numbe ...

  2. 使用MAT(Memory Analyzer Tool)工具分析dump文件--转

    原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...

  3. android matix滤镜,使用MAT (Memory Analyzer Tool)分析Andriod项目内存泄漏

    前言: 在上一篇文章介绍了如何使用Android Monitor分析项目查找内存泄漏 ,本篇将介绍如何使用MAT(Memory Analyzer Tool)来分析和查找项目中内存泄漏的地方 MAT介绍 ...

  4. linux分析mat使用教程,使用MAT(Memory Analyzer Tool)工具分析dump文件

    <使用MAT(Memory Analyzer Tool)工具分析dump文件> 前言 生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果 ...

  5. MAT(Memory Analyzer Tool)工具入门介绍

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 1.MA ...

  6. 内存分析工具MAT的使用

    原文链接:http://www.jianshu.com/p/d8e247b1e7b2 MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速. ...

  7. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

    1. MAT 工具简介 MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具.其通过展现 JVM 异常时所记录的运行时堆转储快照(Hea ...

  8. 内存分析工具MAT介绍

    MAT(Memory Analyzer Tool)是一个基于Eclipse的内存分析工具,是一个快速.功能丰富的java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 官网地址:htt ...

  9. Mac OS下MAT(Memory Analyzer Tool)安装与启动

    简述 MAT(Memory Analyzer Tool),内存分析工具,是一款常用的JVM调优工具,对于分析内存泄漏(Memory Leak)有奇效. 本文主要描述在Mac系统下,如何安装MAT及成功 ...

最新文章

  1. 【TensorFlow2.0】(7) 张量排序、填充、复制、限幅、坐标选择
  2. CSDN上究竟可以上载多大的GIF文件?
  3. 【LSH源码分析】p稳定分布LSH算法
  4. springboot的redis工具类编写(采用RedisTemplate)(简单的取值,取多个值)。
  5. vscode 使用笔记
  6. 无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...
  7. 中国人为什么学不会英语
  8. 通过接口操作MyBatis及数据库配置文件
  9. C++Builder编程中动态更改自定义打印纸张
  10. 炉石整活拔线方法_酒馆战棋:整活如何简单“拔线”?瓦娘在线教学,却3本得死神?...
  11. 五分钟彻底学会iptables防火墙--技术流ken
  12. 面试常被问的65个问题及回答技巧(请收藏)
  13. python 虚拟环境 windows_Python虚拟环境(Windows版)
  14. Too many open files故障解决一例
  15. JavaScript学习第一天——计算机基础导学(编程语言、计算机基础)
  16. 结合插件实现【IDM+百度网盘】高速下载
  17. 基于SpringBoot超市库存管理系统+文档
  18. JESD204B调试笔记(实用版)
  19. 砂.随笔.十七.谋定而后动
  20. Cygwin 下载安装

热门文章

  1. 秋招历险记-深度学习
  2. 【学习记录】基于python爬取Flickr图片及元数据
  3. 【NOIP2018模拟赛2018.10.22】pets
  4. Flutter 日历
  5. 日本处方药【治疗肠癌】
  6. 腾讯安全科恩实验室荣获“AutoSec安全之星”年度杰出汽车信息安全实验室
  7. 浅谈物联网安全威胁与挑战
  8. mysql meb物理备份
  9. 2020年计算机专业大学生笔记本电脑推荐,大学生笔记本买什么好 2020年最佳配置高颜值的笔记本电脑排行推荐...
  10. WPI交通信号灯数据集格式转换成VOC2007