一次使用eclipsememoryanalyzer分析tomcat内存溢出 

一次使用eclipsememoryanalyzer分析tomcat内存溢出 

ID:22669400

大小:126.59 KB

页数:11页

时间:2018-10-30

一次使用eclipsememoryanalyzer分析tomcat内存溢出 _第1页
一次使用eclipsememoryanalyzer分析tomcat内存溢出 _第2页
一次使用eclipsememoryanalyzer分析tomcat内存溢出 _第3页
一次使用eclipsememoryanalyzer分析tomcat内存溢出 _第4页
一次使用eclipsememoryanalyzer分析tomcat内存溢出 _第5页
资源描述:

《一次使用eclipsememoryanalyzer分析tomcat内存溢出 》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、在平吋开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出/,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况:1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用

2、EclipseMemoryAnalyzertool(MAT)工具分析的过程。生成dump文件通过jvm参数一XX:-HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照;或者,用jmap生产dump文件,win通过任务管理器查看tomcat的进程pid,linux用ps命令查看进程pid,然后用jmap命令(Java5:jmap-heap:format=bpid>;Java6:jmap-dump:format=b,file=HeapDump.bin)oMAT安装与介绍/

3、downloads,phpo图:我这里使用的是,我一生产环境项目,运行一段时间大概3周的样子,就会报OutOfMcmoryError。(ps:这个项目出现这种情况已经有好长一段时间了,我们之前的做法是定期的重启tomcat,没有去分析它的原因。)JDK64位主要参数:-Xmx3078M-Xms3078M-XX:PermSize=1024M-XX:MaxPermSize=1024M,内存还是蛮大的。卜载地址:http://www.cclipse,org/mat通过MAT打开dump出来的内存文件,打开后如下从上图可以看到它的大部分功能。

4、1.Histogram可以列出内存屮的对象,对象的个数以及大小。2.DominatorTree可以列出那个线程,以及线程下面的那些对象占用的空间。3.Topconsumers通过图形列出最大的object。4.LeakSuspects通过MA自动分析泄漏的原因。Histogram如下图:Objects:类的对象的数量。Shallowsize:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。Retainedsize:是该对象自己的shal1owsize,加上从该对象能直接或间接访问到

5、对象的shallowsize之和。换句话说,retainedsize是该对象被GC之后所能回收到内存的总和。我们发现ThreadLocal和bingo,persister.dao.Daos类的对象占用了很多空间。DominatorTree如下图:我们发现qmrrtz的定时器的工作线程(10个)占了很多的内存空间Topconsumers如下图:这里显示了内存中最大的对象冇哪些,他们对应的类是哪些,类加载器classloadcr是哪些。有些时候,我们在这里就可以看到代码泄露的位置。LeakSuspects如下图:从那个饼图,该图深色区域被

6、怀疑有N存泄漏,可以发现整个heap才250M内存,深色区域就占了34%。后面的描述,告诉我们quartz线程占用了大量内存,并指出systemclassloader加载的〃java,lang.ThreadLocal"实例的内存中聚集(消耗空间),并建议用关键字"java.lang.ThreadLocal$ThreadLocalMap$Entry[]"进行检査。所以,MAT通过简单的报告就说明了问题所在。LeakSuspects如下图:从那个饼图,该图深色区域被怀疑有N存泄漏,可以发现整个heap才250M内存,深色区域就占了34%。

7、后面的描述,告诉我们quartz线程占用了大量内存,并指出systemclassloader加载的〃java,lang.ThreadLocal"实例的内存中聚集(消耗空间),并建议用关键字"java.lang.ThreadLocal$ThreadLocalMap$Entry[]"进行检査。所以,MAT通过简单的报告就说明了问题所在。通过LeakSuspects的ProblemSuspect1点击【Details》】,如下图如下图所示的上下文菜单中选择Listobjects->withoutgoningreferences,查看Thre

8、adLocal都应用了些什么对象。现在看到ThreadLocal中引用的对象如下图:是dao对象ps:该dao对象包含—、个轻量级的ORM关系内容,所以Retainedsize比较大。下面继续查看dao的gcROOT如下

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。