Eclipse Memory Analyzer(MAT)使用
https://user.qzone.qq.com/731573705/blog/1436389384
Eclipse Memory Analyzer(MAT)使用
平时开发、测试过程中,有时会遇到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)使用的更多相关文章
- mat(Eclipse Memory Analyzer tool)之二--heap dump分析
文章中的shallow.retained关键字的说明见:GC是如何回收时的判断依据.shallow size.retained size 在本文中,将介绍MAT(Eclipse Memory Anal ...
- 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇
Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...
- [原创]Eclipse Memory Analyzer tool(MAT)工个使用介绍
[原创]Eclipse Memory Analyzer tool(MAT)工个使用介绍
- mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析
概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...
- 使用Eclipse Memory Analyzer Tool(MAT)分析故障
Eclipse Memory Analyzer Tool(MAT)是一个强大的基于Eclipse的内存分析工具,可以帮助我们找到内存泄露,减少内存消耗. 工作中经常会遇到一些内存溢出.内存泄露等问题, ...
- MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程
在看深入JVM虚拟机一书(p50,2.4 实战OutOfMemoryError),有一个Java堆溢出的例子,使用到了Eclipse Memory Analyzer插件,由于自己现在使用的是MyEcl ...
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)
前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可 ...
随机推荐
- rest framwork 小试身手
models.py from django.db import models class Course(models.Model): """ 课程表 "&quo ...
- Rime 小狼毫 注意事项
https://rime.im/https://github.com/rime/weasel/pulse 打不出中文可能是,没有五笔需要的文件: wubi_pinyin.schema.yamlCtrl ...
- vue单页面模板说明文档(2)
Linter Configuration This boilerplate uses ESLint as the linter, and uses the Standard preset with s ...
- 使用node写一个简单的页面操作
let http = require('http'); let urlStr = require('url'); let fs = require('fs'); let path = require( ...
- vue.js 添加 fastclick的支持
fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...
- python爬虫scrapy的LinkExtractor
使用背景: 我们通常在爬去某个网站的时候都是爬去每个标签下的某些内容,往往一个网站的主页后面会包含很多物品或者信息的详细的内容,我们只提取某个大标签下的某些内容的话,会显的效率较低,大部分网站的都是按 ...
- Socket构造但不连接
Socket socket = new Socket(); SocketAddress address = new InetSocketAddress("localhost",80 ...
- js splice vs slice
js splice vs slice https://stackoverflow.com/questions/37601282/javascript-array-splice-vs-slice htt ...
- DAY04、流程控制if、while、for
一.if 判断 语法一: if 条件: # 以下是上一条if 的子代码块 print(子代码1) print(子代码2) print(子代码3) 示例: # 路边飘过一个生物,要不要表白? sex = ...
- 如何在Mac系统安装MySQL
方法一: (1)使用brew install mysql (2)使用mysql -uroot连接时报错: Authentication plugin 'caching_sha2_password' c ...