https://user.qzone.qq.com/731573705/blog/1436389384

Eclipse Memory Analyzer(MAT)使用

 一、OutOfMemoryError

平时开发、测试过程中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题,我们需要找出造成OutOfMemoryError原因。

一般有两种情况:

1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;

2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。

以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。

常见OutOfMemoryError

java.lang.OutOfMemoryError:Java heap space

Java虚拟机堆里面已经没有更多的空间了。你正准备创建一个新的对象,但是这个要创建的对象需要的内存已经超过了虚拟机所剩的了。虚拟机会尝试通过full GC来回收内存,如果不行的话,就会抛出这个信息(可以通过-Xmx参数增加堆的大小来解决),如果不行,还是要找到出现问题的原因

java.lang.OutOfMemoryError:PermGen space

和第一个现象差不多,不过这里准备分配内存的空间是持久代。同样的,空间已经不够了,(增加了-XX:MaxPermSize这个参数的值,问题通常就解决了)

java.lang.OutOfMemoryError: GC overhead limit exceeded

这个问题有点特殊。这里没有提示说堆还是持久代有问题,虚拟机只是说程序花在垃圾回收上的时间太多了,却没有什么见效。默认的话,如果98%的时间都花在GC上并且回收了才不到2%的空间的话,虚拟机才会抛这个异常。

以上三种错误覆盖了98%以上的场景

java.lang.OutOfMemoryError: unable to create new nativethread

如果虚拟机正在请求操作系统创建一个本地线程,而操作系统无法创建的时候,你会收到这个报错信息。

java.lang.OutOfMemoryError:nativeGetNewTLA

指当虚拟机不能分配新的线程本地空间(Thread Local Area)的时候错误信息。这个异常只有在jRockit虚拟机时才会碰到。线程本地空间是多线程程序里面为了更有效的进行内存分配而建立的缓存。每一个线程都有一份自己的缓存,当这个线程要创建对象的时候,就在这上面分配。如果你有很多线程同时并发,又要创建大量的对象,可能会出现这个问题,这种情况下你可以调整一下-XXtlaSize这个参数

java.lang.OutOfMemoryError:Requested array size exceeds VM limit

当创建一个超过虚拟机允许的大小的数组时,这条错误就会出现

java.lang.OutOfMemoryError:request bytes for . Out of swap space

这个错误是当虚拟机向本地操作系统申请内存失败时抛出的。这个和用完了堆或者持久化中的内存的情况有些不同。这个错误通常是在程序已经逼近平台限制的时候产生的。这个信息告诉你可能已经用光了物理内存以及虚拟内存了。

二、MAT使用

1、Mat插件安装

1)下载Mat ,Mat下载地址:http://www.eclipse.org/mat/

2)解压下载包:放到eclipse或myeclipse安装目录的dropins目录下

3)启动eclipse或myeclipse,打开window - > open perspective,看到Memory Analysis证明安装成功

也可以使用其它方法进行安装,不一一说明

2、生成dump文件

首前制造一条内存泄漏的用例,执行使程序报OutOfMemoryError

# ps -ef | grep java

# jmap -dump:live,format=b,file=mpfile1309

3、使用mat分析

启动eclipse或myeclipse,打开file - > Open heap dump,在弹出的对话框选择生成的dump文件(mpfile)打开heapDumps文件,就可以看到MAT给出了overview page

结果查看:

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

分析:

Histogram如下图:

Objects:类的对象的数量;

Shallow size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和;

Retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。

我们发现cn.test.TestBean类的对象占用了很多空间。

DominatorTree如下图:

我们发现cn.test.TestMain-java.util.arraylist-java.lang.object用了很多空间

Top consumers如下图:

这里显示了内存中最大的对象有哪些,他们对应的类是哪些,类加载器classloader是哪些。

有些时候,我们在这里就可以看到代码泄露的位置。

Leak Suspects如下图:

该图深色区域被怀疑有内存泄漏,深色区域就占了69.1%。后面的描述,告诉我们怀疑问题出在java.lang.object中。所以,MAT通过简单的报告就说明了问题所在。

通过Leak Suspects的Problem Suspect 1点击【Details】

从详细内容中我明可以明确的查出是cn.test.TestBean类的对象有问题,内存溢出

以上是通过MAT分析Tomcat应用程序,找到内存泄露的原因,还有许多不足之处,希望大家多多指教

Eclipse Memory Analyzer(MAT)使用的更多相关文章

  1. mat(Eclipse Memory Analyzer tool)之二--heap dump分析

    文章中的shallow.retained关键字的说明见:GC是如何回收时的判断依据.shallow size.retained size 在本文中,将介绍MAT(Eclipse Memory Anal ...

  2. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

  3. [原创]Eclipse Memory Analyzer tool(MAT)工个使用介绍

    [原创]Eclipse Memory Analyzer tool(MAT)工个使用介绍

  4. mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...

  5. 使用Eclipse Memory Analyzer Tool(MAT)分析故障

    Eclipse Memory Analyzer Tool(MAT)是一个强大的基于Eclipse的内存分析工具,可以帮助我们找到内存泄露,减少内存消耗. 工作中经常会遇到一些内存溢出.内存泄露等问题, ...

  6. MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程

    在看深入JVM虚拟机一书(p50,2.4 实战OutOfMemoryError),有一个Java堆溢出的例子,使用到了Eclipse Memory Analyzer插件,由于自己现在使用的是MyEcl ...

  7. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...

  8. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  9. 使用 Eclipse Memory Analyzer 进行堆转储文件分析

    Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可 ...

随机推荐

  1. setState的参数接收函数

  2. IdentityServer4【QuickStart】之利用OpenID Connect添加用户认证

    利用OpenID Connect添加用户认证 利用OpenID Connect添加用户认证 在这个示例中我们想要通过OpenID Connect协议将交互用户添加到我们的IdentityServer上 ...

  3. 理解根目录,classpath, getClass().getResourceAsStream和getClass().getClassLoader().getResourceAsStream的区别

    一: 理解根目录 <value>classpath*:/application.properties</value> <value>classpath:/appli ...

  4. zTree树形菜单交互选项卡效果实现

    1. 添加自定义属性 page 2. 为 ztree 每个树形节点,添加点击事件 <!DOCTYPE html> <html> <head> <meta ch ...

  5. 在linux和本地系统之间进行数据传输的简单方法--lrzsz

    lrzsz是一款在linux里可代替ftp上传和下载的程序. >>提君博客原创  http://www.cnblogs.com/tijun/  << 提君博客原创 安装和使用非 ...

  6. PMP三点

    三点估算:悲观36天,可能21天,乐观6天.在16至26天内完成的概率是多少?这个算法是PERT估算最终估算结果=(悲观工期+乐观工期+4×最可能工期)/6=(36+6++4*21)/6=21标准差= ...

  7. Web移动端---iPhone X适配(底部栏黑横线)

    一.相信大家有被iPhone X底部黑色横线支配的恐惧 上面我们可以看到,底部的导航栏被一条黑色横线所盖住,那么就很烦.下面我们可以开始进行适配环节 1.首先我们可以用 JS 判断手机环境是不是 iP ...

  8. python学习笔记(4)-基本数据类型-数字类型及操作

    大学mooc 北京理工大学 python语言程序设计课程学习笔记 一.整数类型 可正可负,没有取值范围的限制(这个与c不同,c要考虑数据类型的存储空间).如pow(x,y),计算x的y次方,pow(2 ...

  9. 在使用IWMS的时候,IWMS自带函数样式无法满足我们需求。以下一段JS是实现左图右字的适用于IWMS的代码。

    <div class="wz-list">里边需要有html做好的Html代码样式</div> <script> var attrnew = & ...

  10. python数据结构与算法第十七天【概率算法】

    1. 古典概率 例如:麻将开始摸到的14张牌中无将的概率,两张相同的牌即为将,则有: 所有的情况:从136张牌中选出14张牌,为C136-14 无将的情况:将不同的牌分组,共有34组,依次取14张牌, ...