下面写些代码来演示一下内存溢出的产生,堆转储文件的生成,堆内存的分析。
首先创建数据持有对象类:
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来转储堆内存文件来分析。