首页 > 其他分享 >MAT 专题

MAT 专题

时间:2022-10-24 16:10:00浏览次数:74  
标签:专题 Incoming MAT 对象 references 引用 Size

​http://smallnetvisitor.iteye.com/blog/1826434​

运行user任务管理器查看到的pid号:

MAT 专题_当前对象

基于jmap导出的堆信息:

MAT 专题_eclipse_02

jmap -dump:live,format=b,file=dump.bin pid
使用jmap来抓dump,在抓dump的时候,我们会把堆全部扒下来:
jmap -dump:format=b,file=path pid

然后会生成一个几百M的包,让运维人员从生产环境拖下来再传给你,然后你用jvisualvm打开,等你打开这个dump的时候,看到你想看的内存的时候,基本上半天时间已经过去了。

其实我们丢了一个很重要的参数:live,这个参数表示我们需要抓取目前在生命周期内的内存对象,也就是说GC收不走的对象,然后我们绝大部分情况下,需要的看的就是这些内存。如果我们把这个参数加上:

jmap -dump:live,format=b,file=path pid

那么抓下来的dump会减少一个数量级,在几十M左右,这样我们传输,打开这个dump的时间将大大减少,为解决故障赢取了宝贵的时间。

 

用装了mat插件的eclipse打开firstHeap.bin文件

选择Leak Suspects Reports模式,finish

MAT 专题_jmap_03

点击details

MAT 专题_jmap_04

MAT 专题_mat_05

这些对象有可能会溢出,然后我们打开OQL窗口

MAT 专题_OQL_06

执行如下OQL语句

MAT 专题_eclipse_07

 

MAT 专题_mat_08

也就是说这个是null,但是仍然有强引用存在,gc的时候是不能回收的,这样就会出现内存的溢出问题

 

不懂就按F1,关于OQL有详细介绍,或进官网  mat Querying Heap Objects:http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fqueryingheapobjects.html

MAT 专题_当前对象_09

一步一个脚印,方便自己复习,该出手时就出手,有错误,一定要指正,非常感谢,共同进步!


所有包含Heap Profling功能的工具(MAT,IBM HA, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.
这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。

Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。

Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

看图理解Retained Size

MAT 专题_eclipse_10

上图中,GC Roots直接引用了A、B和D三个对象。

A对象的Retained Size=A对象的Shallow Size
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

 

这里不包括D对象,因为D对象被GC Roots直接引用。

如果GC Roots不引用D对象呢?

MAT 专题_mat_11

此时,
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size + D对象的Shallow Size

​http://bjyzxxds.iteye.com/blog/1532937​​​
JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?
Incoming References:  引用了当前对象的对象
Outgoing References:  当前对象引用的对象
让我们通过示例来了解有关 Incoming references 和 Outgoing references 的更多知识。例如,一个应用程序的源代码如下所示

public class A {
private C c1 = C.getInstance();
}
public class B {
private C c2 = C.getInstance();
}
public class C {
private static C myC = new C();
public static C getInstance() {
return myC;
}
private D d1 = new D();
private E e1 = new E();
}
public class D {
}
public class E {
}
public class SimpleExample {
public static void main (String argsp[]) throws Exception {
A a = new A();
B b = new B();
}
}

现在,如果要为上述示例应用程序以图形方式绘制对象,则其外观将如下所示:

MAT 专题_当前对象_12

图 1:示例应用程序的对象引用图

对象 A 和对象 B 持有对象 C 的引用
对象 C 持有对象 D 和对象 E 的引用
在这个示例项目中,让我们具体分析下对象 C 的 Incoming references 和 Outgoing references 。

对象 C 的 Incoming References

拥有对象 C 的引用的所有对象都称为 Incoming references。

MAT 专题_jmap_13

 

在此示例中,对象 C 的“Incoming references”是对象 A、对象 B 和 C 的类对象 。

为了证实这个判断,我们从上述示例应用程序中捕获了堆 Dump 文件,并将其载入到 Eclipse MAT 中进行分析。


下图是 Eclipse MAT 针对对象 C 报告的 Incoming references

MAT 专题_eclipse_14

 

 

 

在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming references“时,Eclipse MAT 会生成上图的报告。报告中展示对象 C 的 Incoming references 为对象 A、对象 B 和 C 的类对象。
Eclipse MAT 还显示了用于引用对象 C 的变量,可以看到使用变量“c1”引用对象 C 的对象 A,类似地,还报告了用于引用对象 C 的其他变量。

对象 C 的 Outgoing References

对象 C 引用的所有对象都称为 Outgoing References。

MAT 专题_jmap_15

 

 

 

在此示例中,对象 C 的“outgoing references”是对象 D、对象 E 和 C 的类对象。以下是 Eclipse MAT 针对对象 C Outgoing references 的报告

MAT 专题_当前对象_16

 

 

在"Dominator Tree"中的 Object C 上单击鼠标右键,然后选择"List Objects",再选择 ”with incoming references“时,Eclipse MAT 会生成上图的报告。报告中展示对象 C 的 Incoming references 为对象 D、对象 E 和 C 的类对象。Eclipse MAT 还按显示对象 C 引用的其他对象。可以看到对象 C 使用变量 d1 引用了对象 D。类似地,报告还显示了对象 C 中使用的其他变量。

通过本文主要阐述了 Incoming references and Outgoing references 之间的区别。

原文:https://dzone.com/articles/eclipse-mat-incoming-outgoing-references
​​​https://cloud.tencent.com/developer/article/1530223​

MAT上展示的默认单位是Byte

MAT 专题_mat_17

 

 

MAT 专题_mat_18

 

 








标签:专题,Incoming,MAT,对象,references,引用,Size
From: https://blog.51cto.com/u_15147537/5790038

相关文章

  • #yyds干货盘点# 动态规划专题:乘积为正数的最长连续子数组
    1.简述:描述给定一个长度为n的整数数组,请你找出其中最长的乘积为正数的子数组长度。子数组的定义是原数组中一定长度的连续数字组成的数组。数据范围:  ,数组中的元素满......
  • #yyds干货盘点# 动态规划专题:环形数组的连续子数组最大和
    1.简述:描述给定一个长度为  的环形整数数组,请你求出该数组的 非空 连续子数组 的最大可能和。环形数组 意味着数组的末端将会与开头相连呈环状。例如,对于数组 而言,......
  • matlab 七段式轨迹 S型速度规划
    1、内容简介略609-可以交流、咨询、答疑2、内容说明S形速度规划相对于梯形速度规划其速度曲线会更加平滑,电机运行会更加平稳。常见的S曲线包括7段式加速度曲线,这种曲线计......
  • Matlab绘图高级部分
    图形是呈现数据的一种直观方式,在用Matlab进行数据处理和计算后,我们一般都会以图形的形式将结果呈现出来。尤其在论文的撰写中,优雅的图形无疑会为文章加分。本篇文章非完全......
  • SAPGUI 里 F1 功能键的用法专题讲解试读版
    本专栏计划的文章数在150篇左右,到2022年10月6日为止,目前已经更新了56篇,专栏完成度为37.3%笔者这套​​零基础快速学习ABAP​​​从2021年4月10日写下第一篇文章以......
  • python-Matplotlib
    Matplotlib:python的2D绘图库,可生成绘图/直方图/功率图/条形图/错误图/散点图等。Matplotlib被集成进Anaconda。网址:https://matplotlib.org一、绘制基础常用场景:画点、......
  • python中format的详解
    format是字符串内嵌的一个方法,用于格式化字符串。以大括号{}来标明被替换的字符串。它通过{}和:来代替%。1、基本用法1.按照{}的顺序依次匹配括号中的值s="{}isa{}......
  • 基于miu小波变换的人体步态数据检测和识别算法matlab仿真
    目录一、理论基础3.2.1加速度计3.2.2陀螺仪 3.3基于IMU设备的人体步态数据的采集二、MATLAB仿真程序三、仿真结果一、理论基础在进行数据采集的过程中,需要根据实......
  • 使用matlab绘制雷达图
    黑色雷达背景,绿色辅助网格线。使用polarplot在matlab雷达图: plt_2D=[];%二维图legend_str_2D={};%二维图fig=figure('Name','Visual2D');pax=polara......
  • #yyds干货盘点# 动态规划专题:连续子数组最大和
    1.简述:描述给定一个长度为 的数组,数组中的数为整数。请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,子数组最小长度为1。求这个最大值。输入描述:第一行为一个正......