测试代码:
import java.util.ArrayList;
import java.util.List;
public class Test {
static class OOMObject{
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<OOMObject> list = new ArrayList<OOMObject>();
while(true)
{
list.add(new OOMObject());
}
}
}
调试参数设置
-Xms20M -Xmx20M是设置堆最小和最大内存空间都为20M,防止堆扩展
运行结果
从结果可以看出发生了内存溢出异常情况,我们用eclipse Memory Analyzer对dump出来的堆转储快照进行分析,首先确定是出现了内存泄露Memory Leak还是内存溢出
Memory Overflow。
如果是内存泄露,通过工具进一步查看泄露对象到GC Roots的引用链,于是能找到泄漏对象通过怎么样的路径与GC Roots相关联并导致收集器无法回收。掌握了泄露对象的信
息和GC Roots引用链的信息,就可以很快的定位到泄露的代码了
如果不存在泄露,可以根据机器配置调整堆Xms 和Xmx参数,从代码上检查是否存在某些对象生命周期过长,尝试减少内存消耗
参考深入理解jvm