首页 > 其他分享 >【Tools】Eclipse MemoryAnalyzer(MAT)工具使用笔记

【Tools】Eclipse MemoryAnalyzer(MAT)工具使用笔记

时间:2024-01-17 12:11:55浏览次数:27  
标签:MAT 对象 Eclipse MemoryAnalyzer references 内存 Heap DruidPooledPreparedStatement

目录
一、前言
1.1 简介
1.2 下载安装
二、使用
2.1 Histogram(直方图)
2.2 Dominator Tree(支配树)
2.3 Top Consumers
2.4 Duplicate Classes(重复类)
2.5 Suspects(疑似泄露点)
三、问题总结
3.1 分析源码
3.2 解决办法
一、前言
1.1 简介
Eclipse Memory Analyzer 是一个快速且功能丰富的Java 堆分析器,可帮助我们发现内存泄漏并减少内存消耗。简称MAT。

1.2 下载安装
下载地址

下载时需要注意自己的jdk版本,选择对应版本的MAT下载。下载完成,解压。就可以直接打开,免安装。

 

二、使用
双击打开 MemoryAnalyzer.exe
左上角File->Open Heap Dump 选择事先准备好的dump文件(hprof文件)

2.1 Histogram(直方图)
直方图提供了每个类对象的统计


Class Name 表示对象类型
Objects:类的对象的数量。
Shallow Heap:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。
Retained Heap:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
我们可以点击Retained Heap让他们按照Retained Heap的大小排序 。从上图可以看出前面的几个对象引用的大部分资源,问题很可能就出现在这些对象上。

2.2 Dominator Tree(支配树)
支配树(Dominator Tree),提供程序中最占内存的对象 。


Class Name 类名
Shallow Heap 浅堆
Retained Heap 深堆
Percentage 百分比
上面的图片可以发现DruidPooledPreparedStatement占用了大部分资源。我们这个时候其实可以直接选择对象右击选择List Objects -> with outgoing references 、 with incoming references 或 Path To GC Roots 看对象的引用链路排查问题。

2.3 Top Consumers
Top Consumers 显示了内存中最大的对象有哪些,他们对应的类是哪些,类加载器classloader是哪些。有些时候,我们在这里就可以看到代码泄露的位置。

 

从上面的图片可以看出来DruidPooledPreparedStatement占用了大部分资源(35.7M)。

2.4 Duplicate Classes(重复类)
Duplicate Classes 检测由多个类加载器加载的类。


2.5 Suspects(疑似泄露点)
提供了MAT诊断的疑似泄露点信息

点击上图的Details信息可以查看详情,如下:

选中一个占用内存较高的对象右击->List objects 然后可以选择with outgoing references 和with incoming references。

with outgoing references 是该对象引用了那些对象实例

with incoming references 是该对象被谁引用

我们还可以进一步查询对象到GC Root的全链路,如图选择去除弱引用

 

疑似泄露点也推断是DruidPooledPreparedStatement造成内存泄露。通过List objects -> with outgoing references 可以看到DruidPooledPreparedStatement的resultSetTrace持有很多的DruidPooledResultSet无法释放。通过with incoming references 可以看到是FilterMap类里面的queryPs占用了很多资源。

三、问题总结
3.1 分析源码
我们找到了代码的FormatMap 发现执行了 DruidPooledPreparedStatement的executeQuery方法。在执行executeQuery方法的时候会把每次查询的结果放到resultSetTrace字段里。因为我们没有清理所有DruidPooledResultSet堆积,导致内存无法回收,最终OOM。

 

3.2 解决办法
DruidPooledPreparedStatement的clearResultSet方法会清理resultSetTrace。但是这个方法是protected的我们不能调用。

最后发现是DruidPooledPreparedStatement的close方法会调用clearResultSet方法清理resultSetTrace。


文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览139126 人正在系统学习中
————————————————
版权声明:本文为CSDN博主「芬达_fenda」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38538285/article/details/122360793

标签:MAT,对象,Eclipse,MemoryAnalyzer,references,内存,Heap,DruidPooledPreparedStatement
From: https://www.cnblogs.com/gaoyanbing/p/17969731

相关文章

  • m基于码率兼容打孔LDPC码ms最小和译码算法的LDPC编译码matlab误码率仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要码率兼容打孔LDPC码BP译码算法是一种改进的LDPC译码算法,能够在不同码率下实现更好的译码性能。该算法通过在LDPC码中引入打孔操作,使得码率可以灵活地调整,同时利用BP(BeliefPropagation)译码算法进行迭代译码,提高了......
  • m基于码率兼容打孔LDPC码ms最小和译码算法的LDPC编译码matlab误码率仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       码率兼容打孔LDPC码BP译码算法是一种改进的LDPC译码算法,能够在不同码率下实现更好的译码性能。该算法通过在LDPC码中引入打孔操作,使得码率可以灵活地调整,同时利用BP(BeliefPropagation......
  • CF1876D Lexichromatography 题解
    Problem-D-CodeforcesLexichromatography-洛谷先注意读题:对于所有的值\(k\),在这个序列的任意子区间\([l,r]\)中,值为\(k\)且为红色的位置数减去值为\(k\)且为蓝色的位置数的绝对值不超过\(1\)注意是任意子区间这说明什么?说明如果只有第二个条件,我......
  • 加权排列熵Weighted Permutation Entropy及多尺度系列(Matlab版)
    学者们开发了各种复杂性度量来比较时间序列并区分规则(例如,周期),混沌和随机行为。提出了加权排列熵概念,其是一个定义简单的复杂性度量,可以很容易地计算任何类型的时间序列,无论是规则的,混沌的,嘈杂的,还是基于现实的时间序列。(matlab代码获取:https://mbd.pub/o/bread/mbd-ZZmbm5pv)参......
  • matlab PID程序
    %设一被控对象G(s)=50/(0.125s^2+7s)%用增量式PID控制算法编写仿真程序%输入分别为单位阶跃、正弦信号,采样时间为1msclear;closeall;ts=0.001;%采样时间sys=tf(50,[0.125,7,0]);%tf是传递函数即被控对象函数G();dsys=c2d(sys,ts,'z');%把控制函数......
  • Encountered fatal error while reloading routing: Routing trace file does not mat
      efinity编译在routersetup时候报错Encounteredfatalerrorwhilereloadingrouting:Routingtracefiledoesnotmatchnetlist(netlistnetcount24888v.tracenetcount0).  解决方案:检查客户工程的PNR页面。beneficialskew页面是否打开,如果是on状态,试......
  • CodeForces 1500C Matrix Sorting
    洛谷传送门CF传送门做了好久。怎么会是呢。题目的操作可以看成,求出一些关键字,使得\(B\)矩阵的行是由\(A\)按照这些第\(1\)关键字、第\(2\)关键字一直到第\(k\)关键字,最后还有一个原来所在行下标的关键字,从小到大排序。肯定是从排好序的\(B\)矩阵入手。首先任意找......
  • MathType选项灰色无法点击或者word无法粘贴,治本解决方案
    问题描述:mathtype安装过后,word中会出现mathtype的选项,但是这时mathtype中的选项是虚的,无法点击,而且此时word无法粘贴内容。解决步骤:1.打开word选项,点击加载项,可以看到mathtype的加载项默认被安装的位置2.再点击“信任中心”——“信任中心设置”——“受信任位置”,我们发现,这......
  • FFmpeg之AVFormat
    (目录)一、概述  avformat中实现了目前多媒体领域中的几乎所有封装格式,可以封装,可以解封装(也叫解复用),根据需求不同,所支持的也有所不同,ffmpeg能否支持一种封装格式的视频的封装与解封装,完全取决于这个库,例如mp4、flv、mkv等容器的封装与解封装;又或者RTMP、RTSP、TCP、UDP等协议......
  • Porsche Piwis 3 is The Ultimate Porsche Diagnostic Tool
     Piwis3isthethirdgenerationofadiagnostictooldevelopedbyPorscheforuseintheirworkshops.ItisaspecializedpieceofequipmentthatallowsPorschetechniciansandmechanicstodiagnoseandtroubleshootissuesinPorschevehicles.PorscheP......