下面写些代码来演示一下内存溢出的产生,堆转储文件的生成,堆内存的分析。

 

首先创建数据持有对象类:

package com.zas.jvm.om;

 

/**

 * 数据对象

 * @author zas

 */

public class DataObject {

         //数据对象ID

         private String id;

         //数据对象内容

         private String des;

        public DataObject(String id, String des) {

                   super();

                   this.id = id;

                   this.des = des;

         }

         public String getId() {

                   return id;

         }

        public void setId(String id) {

                   this.id = id;

         }

         public String getDes() {

                   return des;

         }

         public void setDes(String des) {

                   this.des = des;

         }

         @Override

         public String toString() {

                   return "DataObject [id=" + id + ", des=" + des + "]";

         }

         /**

          * @param args

          */

         public static void main(String[] args) {

         }

}

溢出演示代码

package com.zas.jvm.om;

import java.util.ArrayList;

import java.util.List;

 

public class OutMemeryTest {

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

         public void testOm(){

                   for (int i = 0; i < 100000; i++) {

                            DataObject data = new DataObject("id&"+i, "des:"+i);

                            list.add(data);

                   }

         }

         /**

          * @param args

          */

         public static void main(String[] args) {

                   OutMemeryTest omt = new OutMemeryTest();

                   for (int i = 0; i < 2; i++) {

                            omt.testOm();

                   }

                   System.out.println("DOne!");

                   try {

                            Thread.sleep(100000000);

                   } catch (InterruptedException e) {

                            e.printStackTrace();

                   }

         }

}

 运行参数设置如下:-Xms64m -Xmx64m -XX:PermSize=8m -XX:MaxPermSize=8m 
-XX:-HeapDumpOnOutOfMemoryError           
见下图:  

   jvisualvm分析效果图:

从上图结合代码明显得出:com.zas.jvm.om.DataObject这个类的对象出了问题。 
以上是一个演示问题产生及定位过程,生产环境的问题千奇百怪需要具体问题具体分析。 
当堆内存巨大时可能要调整jdk\lib\visualvm\etc\visualvm.conf文件中的-xms -xmx大小来导入转储文件。 
生产环境为linux的较多,可以借助jdk自带的jmap来转储堆内存文件来分析。