- 浏览: 252743 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
郑涵魁:
这才是好文啊
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
silvia016:
很有用,非常感谢
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
chengcwn:
好文章,多谢分享!
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 -
young7:
不错,特别是那个参考文章
JAVA调用Shell脚本--及阻塞的解决办法 -
zhujianbogo:
什么邮件列表,能说下解决方案吗? 谢谢 。 我也遇到这个问题了 ...
Tomcat与apache2集群的问题
前言
在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况:
1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。
以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。
以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。
生成dump文件
通过jvm参数--XX:-HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照;
或者,用jmap生产dump文件,win通过任务管理器查看tomcat的进程pid,linux用ps命令查看进程pid,然后用jmap命令(Java5:jmap -heap:format=b <pid>;Java6:jmap -dump:format=b,file=HeapDump.bin <pid>)。
我这里使用的是,我一生产环境项目,运行一段时间大概3周的样子,就会报OutOfMemoryError。(ps:这个项目出现这种情况已经有好长一段时间了,我们之前的做法是定期的重启tomcat,没有去分析它的原因。)JDK64位主要参数:-Xmx3078M -Xms3078M -XX:PermSize=1024M -XX:MaxPermSize=1024M,内存还是蛮大的。
MAT安装与介绍
下载地址:http://www.eclipse.org/mat/downloads.php。
通过MAT打开dump出来的内存文件,打开后如下图:
![](http://dl.iteye.com/upload/attachment/0066/6787/84bb3118-17b2-366c-923f-8fc3fb03705b.png)
从上图可以看到它的大部分功能。
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之后所能回收到内存的总和。
我们发现ThreadLocal和bingo.persister.dao.Daos类的对象占用了很多空间。
![](http://dl.iteye.com/upload/attachment/0066/6785/970df6ba-575b-3fb9-9a0d-4cc34fcead6b.png)
Dominator Tree如下图:
我们发现quartz的定时器的工作线程(10个)占了很多的内存空间
Top consumers如下图:
这里显示了内存中最大的对象有哪些,他们对应的类是哪些,类加载器classloader是哪些。
有些时候,我们在这里就可以看到代码泄露的位置。
![](http://dl.iteye.com/upload/attachment/0066/6796/ef17e5cd-d7ec-3d8b-a07b-70c65fc7783e.png)
Leak Suspects如下图:
从那个饼图,该图深色区域被怀疑有内存泄漏,可以发现整个heap才250M内存,深色区域就占了34%。后面的描述,告诉我们quartz线程占用了大量内存,并指出system class loader加载的"java.lang.ThreadLocal"实例的内存中聚集(消耗空间),并建议用关键字"java.lang.ThreadLocal$ThreadLocalMap$Entry[]"进行检查。所以,MAT通过简单的报告就说明了问题所在。
![](http://dl.iteye.com/upload/attachment/0066/6791/6be4bf4e-d7f6-33f6-a5b1-2aef78d7ab84.png)
通过Leak Suspects的Problem Suspect 1点击【Details »】,
如下图如下图所示的上下文菜单中选择 List objects -> with outgoning references, 查看ThreadLocal都应用了些什么对象。
![](http://dl.iteye.com/upload/attachment/0066/6794/77779fa4-20d9-329e-b7fb-d1117d494592.png)
现在看到ThreadLocal中引用的对象如下图:
是dao对象
ps:该dao对象包含一个轻量级的ORM关系内容,所以Retained size比较大。
![](http://dl.iteye.com/upload/attachment/0066/6793/9cf2d100-bf3f-394c-b86f-5577707d7778.png)
下面继续查看dao的gc ROOT
如下图所示的上下文菜单中选择 Path To GC Roots -> exclude weak references, 过滤掉弱引用,因为在这里弱引用不是引起问题的关键。
![](http://dl.iteye.com/upload/attachment/0066/6803/f0a604d4-506f-37e9-a88e-333c730be019.png)
从下图中,可以看到在org.quartz.simpl.SimpleThreadPool中保存了daos的引用。所以可以得出是是因为定时器在运行的过程中持有大量的Daos对象应起了内存泄露。为什么会有那么多的Daos呢,Daos不是一个无状态的单例的、可以重用的吗?继续查看spring配置文件发现Daos的bean配置成scope="prototype",导致定时任务又是每次调用都生产新的Daos实例。由于是Daos是无状态的,修改为单例的,问题解决。
![](http://dl.iteye.com/upload/attachment/0066/6801/c9820b9e-1f42-30cc-9d32-c3c390288b3f.png)
以上是通过MAT分析Tomcat应用程序,找到内存泄露的原因,并解决。
评论
7 楼
郑涵魁
2016-05-03
这才是好文啊
6 楼
silvia016
2016-04-19
很有用,非常感谢
5 楼
chengcwn
2015-08-12
好文章,多谢分享!
![](/images/smiles/icon_idea.gif)
4 楼
bingyingao
2013-01-25
好文章,mark
3 楼
chuchu521
2012-08-31
还是不太明白怎样去分析!!!
![](/images/smiles/icon_sad.gif)
2 楼
libo_591
2012-04-17
讲解的很详细,好文
1 楼
jyjava
2012-04-16
lz这个文章很好,对于大型项目很有帮助,
发表评论
-
Java文件读写数据流
2012-08-30 20:30 3676数据流可分节点流( ... -
apache2.2+tomcat超时503
2012-03-26 10:35 3394最近apache2.2+tomcat5.5.28(两个) ... -
Tomcat与apache2集群的问题
2012-03-16 14:53 2443最近在Tomcat与apache2集群的问题的应用程序中 ... -
JVM的参数设置的一个要点
2012-03-11 00:07 2519JVM参数的设置(特别是 –Xmx –Xms –Xmn ... -
【转载】理解Heap Profling名词-Shallow和Retained Sizes
2012-03-06 17:22 2886转载请注明原文链接:h ... -
更改eclipse author的默认名字(作者)
2011-09-07 12:39 1643在eclipse的目录下找到eclipse.in ... -
【转载】java.lang.OutOfMemoryError: PermGen space及其解决方法
2011-08-27 12:18 1220java.lang.OutOfMemoryError: P ... -
JAVA NIO
2011-08-19 22:25 683NIO流是一个比IO流(字节字符)效率高很多,因为是以块 ... -
XMLGregorianCalendar 与 Date 转换
2011-06-28 17:01 1906XMLGregorianCalendar 与 Date ... -
Web Service 的描述语言WSDL说明
2011-05-27 10:28 1184<?xml version="1. ... -
spring+quartz的配置文件
2011-05-26 21:23 1205spring+quartz的配置文件 &l ... -
JAVA调用Shell脚本--及阻塞的解决办法
2011-05-16 13:13 8744用java调用shell,使用 Process p=Runt ... -
WIN7安装WebSphere6.1
2011-03-23 12:55 0首先是安装,我们决定安装WebSphere6.1。 ... -
Jbpm4常用操作
2011-03-06 15:00 2617Jbpm4常用操作 一、ProcessEngine:流程 ... -
ThreadLocal
2010-11-08 21:40 838ThreadLocal -
小记--tomcat 常见问题
2010-10-12 22:29 11271. tomcat 6 undepl ... -
SimpleDateFormat用法说明
2010-09-19 13:02 1404关于java.text.SimpleDateFormat。 ... -
常用的jar包总结(4)
2010-08-13 12:34 1681最近用新的一套web框架做项目,有很多常用的包集成在里面。 ... -
常用的jar包总结(3)
2010-08-11 23:27 2013最近用新的一套web框架做项目,有很多常用的包集成在里面 ... -
常用的jar包总结(2)
2010-08-11 23:27 1876最近用新的一套web框架做项目,有很多常用的包集成在里面 ...
相关推荐
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象...
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...
MAT Eclipse Memory Analyzer 中文文档 PDF 共 93 页 MAT Eclipse Memory Analyzer 中文文档 PDF 共 93 页
Eclipse Memory Analyzer mac 版本 1.8.1 & 安装使用指南
Eclipse Memory Analyzer是一款基于Eclipse的内存分析工具,mac版,不需要安装Eclipse,可以直接运行,用来分析内存泄漏等问题
此软件是mat内存分析软件的无需安装版本,点击打开即可使用,Memory Analyzer Version 1.7.0
Eclipse Memory Analyzer(MAT)是一款专业且功能强大的Java堆转储(heap dump)分析工具,由Eclipse基金会开发。它旨在帮助Java开发者诊断和解决内存泄漏、内存占用过高等问题,提升应用程序的性能和稳定性。MAT...
MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory Analyzer Tool,用来帮助分析内存泄漏和减少内存消耗。使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收...
使用 Eclipse Memory Analyzer 进行堆转储文件分析_files
EclipseMemoryAnalyzer使用说明书
EclipseMemoryAnalyzer-x86_64,MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip
mat介绍 博文链接:https://seanhe.iteye.com/blog/898277
打开“解压路径\mat\MemoryAnalyzer.exe”后,拖入*.hprof文件即可,亲测可以使用。
Eclipse Memory Analyzer1.8.1&安装使用指南
MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。 1. MemoryAnalyzer.ini中的参数一般默认为-vmargs– ...
Eclipse--Memory-Analyzer中文教程,配合博客原文使用
资源名称:Eclipse Memory...Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。 这个版本是支持jdk11的,上一个1.11的版本是jdk1.8的。收大家分就是因为下载比较难搞。
java eclipse memory analyzer(MAT) 内存分析工具 64位
MemoryAnalyzer 使用中文