http://smallnetvisitor.iteye.com/blog/1826434
运行user任务管理器查看到的pid号:
基于jmap导出的堆信息:
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
点击details
这些对象有可能会溢出,然后我们打开OQL窗口
执行如下OQL语句
也就是说这个是null,但是仍然有强引用存在,gc的时候是不能回收的,这样就会出现内存的溢出问题
不懂就按F1,关于OQL有详细介绍,或进官网 mat Querying Heap Objects:http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fqueryingheapobjects.html
一步一个脚印,方便自己复习,该出手时就出手,有错误,一定要指正,非常感谢,共同进步!
所有包含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
上图中,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对象呢?
此时,
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();
}
}
现在,如果要为上述示例应用程序以图形方式绘制对象,则其外观将如下所示:
图 1:示例应用程序的对象引用图
对象 A 和对象 B 持有对象 C 的引用
对象 C 持有对象 D 和对象 E 的引用
在这个示例项目中,让我们具体分析下对象 C 的 Incoming references 和 Outgoing references 。
对象 C 的 Incoming References
拥有对象 C 的引用的所有对象都称为 Incoming references。
在此示例中,对象 C 的“Incoming references”是对象 A、对象 B 和 C 的类对象 。
为了证实这个判断,我们从上述示例应用程序中捕获了堆 Dump 文件,并将其载入到 Eclipse MAT 中进行分析。
下图是 Eclipse MAT 针对对象 C 报告的 Incoming references
在"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。
在此示例中,对象 C 的“outgoing references”是对象 D、对象 E 和 C 的类对象。以下是 Eclipse MAT 针对对象 C Outgoing references 的报告
在"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