内存泄露分析OutOfMemoryError-(Memory Analyzer Tool,MAT)

来源:互联网 发布:热力系统计算软件 编辑:程序博客网 时间:2024/06/05 09:37

大家在开发J2EE应用时可能经常碰到OOM(OutOfMemoryError)的问题。出现这种问题的原因就是内存消耗殆尽,创建新的对象时没有可分配的内存了。OOM的原因,是Old区在FULL GC之后的剩余空间,仍然无法承载Young区要晋升的对象大小。本文是通过MAT工具进行分析。

首先我们要知道,MAT通过分析OOM后的Java heap dump文件,通过对dump文件的分析找到内存可能泄露的点。了解这个之后,我们首先需要生成dump文件,这里我可以编写一个小程序,如:

import java.util.ArrayList;import java.util.List;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<String>();// 10M的PermSize在integer范围内足够产生OOM了while (true) {list.add(new String("test"));}}}

(一)dump文件生成

运行该程序时设置JVM的堆内存的极限值为5M(-Xmx5m),并加上-XX:+HeapDumpOnOutOfMemoryError此参数是帮助生成dump文件,程序启动后直到抛出OOM异常。异常抛出后,在程序的classpath下会生成以一个以.hprof结尾的文件,如:java_pid4504.hprof,这就是我们需要的dump文件。

-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,如不设置,默认存储在jvm 运行环境目录。如:


②还有一种生存dump文件的方式是采用jmap获取,对于部署到服务器上的程序可以采用这种方式,生成后下载到本地分析。获取命令为:

jmap -dump:format=b,file=<dumpfile.hprof> <pid>  

(二)dump分析

现在dump文件有了,现在我们就可以使用MAT工具对该dump文件分析。首先需要下载安装MAT,安装有两种形式:

①直接下载绿色版本的MemoryAnalyzer(推荐使用,方便),下载地址(http://download.csdn.net/download/wwd0501/10136257,http://www.eclipse.org/mat/downloads.php)

②在eclipse中集成mat插件,集成方法自行搜索吧,文章一堆。

安装后,就可以使用软件分析dump文件了。打开MemoryAnalyzer--》open File



(三)MAT介绍

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

当服务器应用占用了过多内存的时候,会遇到OutOfMemoryError。如何快速定位问题呢?Eclipse MAT的出现使这个问题变得非常简单。它能够离线分析dump的文件数据。
    Eclipse MAT是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。它可比Sun提供的内存镜像分析工具jhat要强太多了。

(四)类似内存分析工具

IBM heapAnalyzer


IBM heapAnalyzer简介以及使用


IBM heapAnalyzer下载地址:ftp://public.dhe.ibm.com/software/websphere/appserv/support/tools/HeapAnalyzer/ha456.jar




阅读全文
0 0
原创粉丝点击