您的位置:首页 > 其它

使用IBM heapAnalyzer分析内存泄露的原因

2012-07-03 14:05 148 查看
大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题的原因就是内存消耗殆尽,创建新的对象时没有可分配的内存了。为了找到真正导致OOM的原因,这里将使用IBM heapAnalyzer工具进行定位。

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

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

List<String> list = new ArrayList<String>();

//10M的PermSize在integer范围内足够产生OOM了

int i = 0;

while (true) {

list.add(new String("test")); }

}

}

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

dump文件有了,现在我们使用heapAnalyzer对该dump进行分析,首先需要安装heapAnalyzer,安装比较简单,只要下载下来直接解压即可,我这里使用的是ha414.jar,要求JDK1.6,设置JAVA_HOME后,通过命令后启动heapAnalyzer,如:java -jar ha414.jar。

HeapAnalyzer启动后的界面如下:



HeapAnalyzer启动后,通过菜单File->Open打开生成的dump文件java_pid4504.hprof。

dump文件加载后,通过菜单Analysis->Tree View展现出来。

通过dump信息分析内存泄漏的对象。主要思路是堆内存占用比例,比例越大说明堆内存消耗越多。

这个例子很简单,通过如下图很快就可定位出内存泄漏的地方。



这里可以看到java/util/ArrayList对象占用堆内容最大,达到93%。当然这里并不是说ArrayList存在问题,而是说ArrayList占用的堆内存较多,不正常,至于为啥会不正常,这还依赖于该对象所处的程序块相关,找到这点问题就解决一大半了。

最后需要在程序中找到使用该对象的地方,再分析程序,确定产生内存泄漏的原因。

转自:http://www.51testing.com/?uid-412661-action-viewspace-itemid-241471
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: