运用IBM heapAnalyzer分析内存泄露的原因(转载)

使用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文件。