IBM heapAnalyzer分析内存泄露

大家在开发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
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值