[转帖]Eclipse-MAT的插件介绍使用

eclipse,mat,插件,介绍,使用 · 浏览次数 : 0

小编点评

Component Report 组件的报告 会分析对象的集合,找到相关的可疑的内存空间,例如重复的字符串,空的集合容器,弱引用等等。这些都是我们认为可疑的内存 Re-open previously run reports 重新打开之前运行的 reports 之前存在的reports会和dump文件在同一个目录下的zip文件中 就是下面的文件: MAT界面的主要功能 下面会依次介绍下面图片的意思 Size是当前dump文件的大小, Classes是dump文件中加载的类的个数是708个, Objects是dump文件中创建了46000个对象.46K就是46*1000,也就是46000 Class Loader是dump文件中使用的类加载器有四个 Unreadchable Objects Histogram 是不可达的对象的直方图 这个是保留的堆快照中内存中最大的对象是多少,你把鼠标点在哪里,然后左边Inspector就显示啥 第一行: 是当前线程的编号 第二行: 不知道 第三行: class java.lang.Thread 就是当前的线程,0xf3801c08是当前线程的编号 第四行: java.lang.Object是父类的信息 第五行: 第六行: shallow 是浅堆 第七行: retained 是深堆 第八行: 堆文件的Overview: 第一行: dump文件的大小 第二行:对象的个数 第三行:类的个数 第四行:类加载器的个数 第五行:Gc roots 对象个数 第六行: 文件的类型 分析堆dump文件

正文

学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记

概述

MAT (Memory Analyzer Tool ) 工具是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况.
MAT是基于Eclipse开发的,不仅仅可以单独使用,还可以作为插件的形式内嵌在Eclipse中使用,是一款免费的性能分析工具,使用起来非常的方便.

MAT主要的功能就是分析dump文件

image.png

image.png

注意:如果单独使用,那么解压即可用,不需要安装即可

image.png
不用安装,直接双击MemoryAnalyzer.exe就可以启动了.

分析堆dump文件

MAT可以分析 heap dump文件,在进行内存分析时,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就可以直观地看到当前的内存信息.
一般来说,这些内存信息包括:

  • 所有的对象信息,包括对象实例、成员变量、存储于栈中的基本类型值和存储在堆中的其它对象的引用值。
  • 所有的类信息,包括classloader、类名称、父类、静态变量等等
  • GCRoot所有的这些对象的引用路径
  • 线程信息,.包括线程的调用栈及此线程的线程局部变量(TLS)

几点说明

  • MAT不是一个万能的工具,并不能处理所有类型的堆存储文件.但是比较主流的厂家和格式,;列如SUN,HP,SAP所采用的HPROF二进制堆存储文件,以及IBM的PHD堆存储文件等都能被MAT很好的解析.也许某个冷门的公司的二进制堆存储文件就无法识别.这个需要大家注意一下
  • MAP最吸引人的地方就是生成内存泄露的报表,方便定位问题和分析问题.虽然说MAT有这么强大的功能,但是内存分析也没有简单到一键完成的程度,很多内存问题还是需要我们从MAT展现给我们的信息当中通过经验和直觉来判断才能发现.

获取DUMP文件的方式

方式1:使用jmap工具生成,可以生成任意一个Java进程的dump文件.
方式2:通过配置jvm参数生成.
image.png
对比:考虑到生产环境中几乎不可能在线对其进行分析,大多都是采用离线分析,因此使用jmap+MAT工具是最常见的组合
方式三: 使用VisualVM 可以导出堆dump文件

方式四: 使用MAT既可以打开一个已有的堆快照,也可以通过MAT直接从活动的Java程序中导出堆快照.这个功能借助于jps列出当前正在运行的Java进程,以供选择并获取快照.
image.png

基本使用案例

案例代码

import java.util.ArrayList;
import java.util.Random;

/**

  • -Xms600m -Xmx600m -XX:SurvivorRatio=8
    /
    public class OOMTest {
    public static void main(String[] args) {
    ArrayList<Picture> list = new ArrayList<>();
    while(true){
    try {
    Thread.sleep(5);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    list.add(new Picture(new Random().nextInt(100
    50)));
    }
    }
    }

class Picture{
private byte[] pixels;

<span class="token keyword">public</span> <span class="token class-name">Picture</span><span class="token punctuation">(</span><span class="token keyword">int</span> length<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>pixels <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">byte</span><span class="token punctuation">[</span>length<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

    启动上面的代码,


    打开已经生成好的hprof文件

    导出hprof文件
    image.png

    用eclipse的MAT插件打开
    image.png

    会出现下面的界面,直接点cancel就可以了 ,点finish也行
    image.png

    image.png

    从进程中生成dump文件快照

    image.png
    根据进程号选择你要查看的进程
    image.png

    image.png
    点击finish即可

    Getting Started Wizard介绍

    image.png

    • leak suspects report 泄露的疑点报告

        这个是mat会自动的检测dump文件,用于查看哪些是泄露的疑点,报告中会说明哪些对象还在存活,以及为什么没有被垃圾回收器收集.
      

      内存泄露的问题非常关注这个,因为内存泄露就是对象不用了,但是为什么不能被垃圾回收器回收.

      • Component Report 组件的报告

        会分析对象的集合,找到相关的可疑的内存空间,比如说重复的字符串,空的集合容器,弱引用等等,这些都是我们认为可疑的内存

      • Re-open previously run reports 重新打开之前运行的 reports

         之前存在的reports会和dump文件在同一个目录下的zip文件中
         就是下面的文件:
        

          image.png

        MAT界面的主要功能

        下面会依次介绍下面图片的意思
        image.png

        image.png
        Size是当前dump文件的大小,
        Classes是dump文件中加载的类的个数是708个,
        Objects是dump文件中创建了46000个对象.46K就是46*1000,也就是46000
        Class Loader是dump文件中使用的类加载器有四个
        Unreadchable Objects Histogram 是不可达的对象的直方图


        image.png
        这个是保留的堆快照中内存中最大的对象是多少,你把鼠标点在哪里,然后左边Inspector就显示啥
        image.png
        第一行: 是当前线程的编号
        第二行: 不知道
        第三行: class java.lang.Thread 就是当前的线程,0xf3801c08是当前线程的编号
        第四行: java.lang.Object是父类的信息
        第五行:
        第六行: shallow 是浅堆
        第七行: retained 是深堆
        第八行:


        堆文件的Overview:

        image.png

        image.png
        第一行: dump文件的大小
        第二行:对象的个数
        第三行:类的个数
        第四行:类加载器的个数
        第五行:Gc roots 对象个数
        第六行: 文件的类型

        分析堆dump文件

        image.png

        image.png

        image.png

        一般分析饼状图的时候先从最大的查看,当然也有可能这个最大的就是我们希望保存在堆里面的数据,那么我们就接着看饼状图第二大的数据,或者第三大的数据,这样就根据自己的项目情况看看哪个是有内存泄露的疑点的,分析出来之后,然后解决一下就完了.

        MAT中Histogram的功能演示

        image.png

        具体内容:

        image.png

        内存中加载的类, Objects是对象的个数, Shallow Heap是占用的浅堆大小, Retained Heap 是占用的深堆的大小


        包分组

        如果显示的类过多的话,也可以用根据包名来分组,分组完了查看就更方便看了.

        image.png
        image.png

        查看目标的gc root

        image.png

        假如说我想看 picture 的gc root ,就可以用 Merge Shortest Paths to GC Roots, 最右面可以排除 引用选项 ,点击查看,就能看到下面 ArrayList对象 0xf663aab8的对象引用了那么多Picture对象,然后你就需要进行分析这些引用是不是合理的,如果不合理的话就尝试着优化它.

        image.png

        对比两个hprof文件的 Histogram值

        image.png

        在b.hprof文件里面点击上面的操作,选择a.hprof文件,然后点ok

        image.png

        然后就基于b.hprof文件去看和a.hprof的区别,可以看到b.hprof比a.hprof多了很多对象信息 +号代表b.hprof比a.hprof多了. 反之 减号 代表少.
        比如说第一行byte[] +27884 的意思就是 b.hprof的byte[] 对象比 a.hprof的byte[] 的Objects多了27884个

        通过这个功能你就可以观察指定时间内哪个对象增长了多少, 比如说下午三点导出a.hprof文件,然后下午四点导出b.hprof文件, 然后通过对比来看看下午四点导出的hprof文件比下午三点导出的hprof文件里面哪个Class Name的指标增加的比较快,这个有可能就是我们要担心的可能会出现oom的类了.

        thread overview

        展示线程的概述情况,我们可以查看当前进程中所有的Java的线程的情况,还可以查看当前的线程中栈祯里面保存的局部变量的信息.

        点击图标:
        image.png

        点击之后显示当前dump文件有六个线程

        image.png

        image.png

        main方法下面的 就是main方法在执行的时候的局部变量,局部变量有可能是对象也有可能是基本数据类型,我们就可以怀疑这些对象是否存在内存泄露的问题
        上图String 就是下面这个main方法的形参,ArrayList就是list对象image.png

        再点看ArrayList 就能看到ArrayList里面有个elementData ,这个elementData 是ArrayList源码里面存数据的数组容器,然后你就会发现elementData类型是Object[]类型 ,并且elementData里面有总共25个Picture对象,
        image.png

        我们读线程局部变量数据的目的就是为了分析哪些手可能会有泄露的问题.


        查看这个对象引用过谁 和 查看谁引用过这个对象

        第一个是出引用(就是这个对象都引用过谁) 第二个是入引用(哪些对象引用过来的)

        image.png

        下面展示的是ArrayList引用了哪些对象
        image.png

        还可以接着看哪些对象引用了这个对象了, 来确定为什么他还没被回收,我们就看看这个指针有没有必要存在,如果没有必要存在的话, 就改成弱引用等等.image.png
        然后查看,只有ArrayList里面的elementData数组引用了这个Picture 0xf399eb18 指针了,这样就没事儿了, 当然如果我们发现这个Picture对象除了被ArrayList引用了,还被别的对象引用了, 那么我们就要担心了,可能会有内存泄露的问题了.
        image.png

        因为案例代码的ArrayList的生命周期挺短的,main方法执行完了,ArrayList就可以被回收了,只要ArrayList挂掉了,那么ArrayList引用的这个Picture也会被挂掉.
        当然下面的代码有while (true )死循环,实际情况下代码基本不会有while(true)这种缺心眼的写法,所以main方法结束了ArrayList就可以被回收了.
        image.png
        但是,如果你Picture对象还是被一个生命周期比较长的对象A引用了,ArrayList销毁了,但是这个对象A还在引用Picture对象,导致Picture无法被销毁回收, 就会存在泄露.
        如果必须要被对象A引用,那么你就可以考虑把这个生命周期比较长的对象A引用Picture对象的引用改成弱引用就可以了.

        文章知识点与官方知识档案匹配,可进一步学习相关知识
        Java技能树首页概览96165 人正在系统学习中

        与[转帖]Eclipse-MAT的插件介绍使用相似的内容:

        [转帖]Eclipse-MAT的插件介绍使用

        学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记 概述 MAT (Memory Analyzer Tool ) 工具是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况. MAT是基于Eclipse开发的,不仅仅可以单独使用,还可以作为插件的形式内嵌在Eclipse中使

        [转帖]Eclipse MAT 内存分析工具

        Exlipse MAT 是一款强大的 Java 堆内存分析工具,我们可以通过该工具实现对 Java 堆内存的分析。 官网。实现查找内存泄漏以及查看内存消耗的情况。 MAT 使用 首先去官网下载对应的软件压缩包,下载地址。MAT 提供了多种平台的软件包支持,包括 Windows , Mac OSX ,

        [转帖]发布即巅峰!万字长文:Java性能调优六大工具:MAT内存分析工具

        jianshu.com/p/4ed3dd8b7b83 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况。MAT是 基于Eclipse开发的一款免费的性能分析工具,读者可以在http://www.eclipse.org

        [转帖]Shallow vs. Retained Heap

        https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fbatch.html&resultof%3D%2522%2562%2561%2574%2563%2568%2522%2520%25

        [转帖]Batch mode

        https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fbatch.html&cp%3D54_3_14 Memory Analyzer can be operated in batch

        [转帖]Analyzing Threads

        https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fcomparingdata.html&cp%3D54_3_11 Memory Analyzer provides several

        [转帖]

        Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

        [转帖]

        https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

        [转帖]ISV 、OSV、 SIG 概念

        ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

        [转帖]Redis 7 参数 修改 说明

        2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww