Eclipse MAT 安装及使用

STS安装方法

Eclipse MAT官方网页:https://www.eclipse.org/mat/downloads.php

  • STS安装路径 :Help -> Eclipse MarketPlace…
  • 搜索 ‘mat’ 然后安装Memory Analzer 1.6.1
  • 重启STS
  • 安装过程中可能会报错:No repository found containing: osgi.bundle,org.apache.commons.io,2.4.0,忽略继续安装即可
    Eclipse MAT 安装及使用_第1张图片

STS Eclipse MAT使用

导入

File -> Import -> Other -> Heap Dump 然后选择Dump文件的路径,选择文件进行导入

界面

  • Histogram可以列出内存中的对象,对象的个数以及大小。
  • Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
  • Top consumers通过图形列出最大的object。
  • Leak Suspects通过MA自动分析泄漏的原因。

名词解释

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

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

OOM解决思路

  • 只要有溢出,时间久了,溢出类的实例数量或者其占有的内存会越来越多,排名也就越来越前,通过多次对比不同时间点下的Histogram图对比就能很容易把溢出类找出来。
  • 通 过Histogram视图或者Dominator Tree视图,找到疑似溢出的对象或者类后,选择Path to GC Roots或者Merge Shortest Paths to GC Roots,这里有很多过滤选项,一般来讲可以选择exclude all plantom/weak/soft etc. references。这样就排除了虚引用、弱引用、以及软引用,剩下的就是强引用。从GC上说,除了强引用外,其他的引用在JVM需要的情况下是都可以 被GC掉的,如果一个对象始终无法被GC,就是因为强引用的存在,从而导致在GC的过程中一直得不到回收,因此就内存溢出了。
  • 接下来就需要直接定位具体的代码,看看如何释放这些不该存在的对象,比如是否被cache住了,还是其他什么原因。
  • 找到原因,清理干净后,再对照之前的操作,看看对象是否还再持续增长,如果不在,那就说明这个溢出点被成功的堵住了。
  • 最后用jstat跟踪一段时间,看看Old和Perm区的内存是否最终稳定在一个范围内,如果长时间稳定在一个范围,那溢出的问题就解决了,如果还再继续增长,那继续用上述方法,看看是否存在其他代码的溢出点,继续找出,将其堵住。

Eclipse MAT 安装及使用_第2张图片

你可能感兴趣的:(并发)