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. C#设计模式之9:模板方法

    模板方法 模板方法是一个方法,定义了算法的步骤,并允许子类为一个或多个步骤提供实现. 本例中用冲泡咖啡和茶的例子来说明: 上图说明了冲泡咖啡和茶的步骤,可以看出冲泡咖啡和茶的步骤差不多,很相似,先来看 ...

  2. 逻辑斯特回归tensorflow实现

    calss #!/usr/bin/python2.7 #coding:utf-8 from __future__ import print_function import tensorflow as ...

  3. vue图表

    https://www.cnblogs.com/powertoolsteam/p/top-9-javascript-charting-libraries.html

  4. Docker操作删除所有容器镜像

    借鉴博客:https://www.cnblogs.com/yanyouqiang/p/8301856.html https://blog.csdn.net/wy_97/article/details/ ...

  5. day 7-18 mysql case when语句

    概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...

  6. PyCharm的使用

    1.pycharm的下载和安装 首先,去jetbrains官网https://www.jetbrains.com/pycharm/download/#section=windows 中下载最新版的pr ...

  7. commons-lang

    今天在编码的过程中,对于null,采用==null进行判断.并且为了过滤"",使用了str.trim().length()==0,当str为null时,报空指针异常. 于是决定使用 ...

  8. 百度编辑器UEditor使用方法

    http://www.cnblogs.com/lionden/archive/2012/07/13/ueditor.html 介绍图片上传:http://uikoo9.com/blog/detail/ ...

  9. ES6字符串操作

    讨论字符串操作之前,我们先来了解一下Unicode 编码的由来,因为Js中的字符串就是一系列Unicode码的集合. 我们都知道,世界上存在着各种各样的语言,汉语,英语,日语等,相对应的,也就存在各种 ...

  10. Photoshop独立安装包下载页面

    下载页面地址:https://helpx.adobe.com/cn/creative-cloud/kb/creative-cloud-apps-download.html