mat 使用笔记

 

MAT 使用初探

今天线上一个应用的持久区满了,一直没有下来,导致一些服务不可用,就用jmap当出内存快照后,用MAT分析内存的基本信息,发现很多地方不会用。找了些资料记录在下来。

 

1.引用

 

  • Strong reference : 就是我们new出来的对象,但是还是被持有的应用,垃圾回收时不会回收这个应用
  • soft reference   : 我们new出来的对象,但是已经不被具体对象持有,常见的就是缓存中的对象引用,垃圾回收在内存还够的时候不会回收该部分内存信息,只有在内存不够时才会回收这块引用的对象
  • weak reference   : 当对象不在有强引用时候,垃圾回收时立刻回收。
  • Phantom reference : 不会在内存中出现,因为它一般是同ReferenceQueue一起出现,来跟踪对象是否还是保持强引用。

 

 

2.术语

shallow size:对象自身中有的内存大小 

retained size:对象自身大小 + 该对象直接或是间接引用对象的shallow size

GC Roots:所有的对象引用refer chains的起点。

mat 使用笔记_第1张图片

 

 

以上左图中以object1来说,单独一个object1大小就是shallow size,object1及所有蓝色对象就是该对象直接或是间接引用的就是retained size。

同理右图中object4还被gc roots引用到,那么retained size就不包含这个。

 

 

 

 

 

3.实例

3.1导入一个内存文件后,用MAT打开,具体如下图所表示

mat 使用笔记_第2张图片

 

 

3.2 details:一些基本信息

Size: 153.7 MB Classes: 331 Objects: 4.1m Class Loader: 3 Unreachable Objects Histogram

 

3.3 biggest object by retained size:显示在内存较大的对象信息

 

list objects -- with outgoing references : 查看这个对象持有的外部对象引用。

list objects -- with incoming references : 查看这个对象被哪些外部对象引用。

 

show objects by class  --  with outgoing references :查看这个对象类型持有的外部对象引用

show objects by class  --  with incoming references :查看这个对象类型被哪些外部对象引用

 

paths to gc root : 显示不同类型引用(上文中提到的Strong ,soft,weak )到跟节点的路径。

merge shorest path to gc root : 合并最短路径到root节点,这个具体没试过。

 

java basics:

    -- classloader 该对象对应的classloader信息 。

    -- thread details :线程信息

    -- thread stacks  :线程堆栈

    -- find String : 在这个对象中查询需要的字符串(还不确定,需要再搞下)

    -- group by : 根据某个字段统计出现的个数 

 

java collections:这个暂时没研究,以后再搞。

 

leak Identification -- top consumers :几个大消耗内存的对象 

 

 

3.4 可用操作

mat 使用笔记_第3张图片

 

actions:列出每个类型的实例数及大小 。

donimator tree :列出所有对象在整个内存对象中所占百分比。比较有用。

Top Consumers: 根据类名和包名列出开销最大的对象。

Duplicate Classes: 查找出在不同classloader中加载的相同类。

 

step by step 方式

mat 使用笔记_第4张图片

 

MAP提供了两种分析方式:

1.查找内存泄漏的方式分析内存

2.通过组件方式分析内存主要从;空对象,重复对象加载等方面。

这个在第一次加载内存文件,或者可以通过

 

 

总结:

1.首先看retained size最大的那些数据,一般看内存都是想解决内存泄漏问题,可以通过Top Consumers或者是donimator tree等actions。

2.找到最大的数据后,通过list objects -- with outgoing references 查看具体持有了哪些对象,或者通过java basics -- classloader 。查看这个是因为我们这次因为perm区满了,需要查看这个数据。到底还是哪些classloader加载了数据。

 

 

tips:

持久区中存放的数据:

  类信息,方法信息,常量池,静态变量,对于加载自己的classloader引用、interned strings(字符串驻留)

 

 

 

你可能感兴趣的:(mat)