深入JVM 实战堆内存溢出

在Java运行时数据区域中,除程序计数器外,其它几个运行时区域都有可能发生OutOfMemoryError错误异常

 

——虚拟机启动可以设定虚拟机启动参数,以Eclipse IDE为例,虚拟机启动参数 VM Args 将影响虚拟机内存空间

 

 

1 Java堆溢出 在主线程中不断创建对象,设置虚拟机启动参数

VM Args: -Xms20m -Xmx 20m -XX:+HeadDumpOnOutOfMemoryError

设定堆大小为20m 同时设定虚拟机出现内存溢出异常时Dump出内存堆转储快照

 

深入JVM 实战堆内存溢出_第1张图片

 注意通过链表保持对堆中对象的引用,否则可能被GC回收,导致无法观察到错误异常

public class HeapOOM {
	/*
	 * 
	 * VM Args : -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
	 * 

	 * 
	 */
	
	static class OOMObject
	{
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		List list=new ArrayList();
		while(true)
		{
			//不断在堆中创建对象
			list.add(new OOMObject());
		}
		
		
		

	}

}

运行结果:

 

深入JVM 实战堆内存溢出_第2张图片

对于这个区域的内存溢出异常,可通过内存映像分析工具对Dump出的转储快照分析,确认内存的对象是否是必要的,也就是区分2种情况 内存泄漏 (Memory leak)还是 内存溢出(Memory Overflow) 

通过Eclipse memory Analyzer工具分析堆转储快照

 

如果是内存泄漏。可进一步通过查看泄漏对象到GC Roots的引用链。于是就能找到泄漏对象是通过怎样的方式与GC root相关联并导致垃圾收集器无法自动回收他们,于是能确定程序出现问题的位置

如果不是内存泄漏,换句话说,堆种的对象还存活,那么应该检查虚拟机的堆参数( -Xmx -Xms) 初步解决堆空间问题

 

 

 

 

 

你可能感兴趣的:(Java进阶,深入理解Java虚拟机)