堆溢出
Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径避免垃圾回收,当到达最大堆的容量限制后就会产生Java.lang.OutOfMemoryError.
/**
* VM Options:
* -Xms20M
* -Xmx20M
* -XX:+HeapDumpOnOutOfMemoryError
*/
public class HeapOOM{
static class OOMObject{}
public static void main(String[] args){
List list = new ArrayList();
while(true){
list.add(new OOMObject());
}
}
}
结果:
GC多次执行后触发OutOfMemoryError.
栈溢出
关于虚拟机栈,在Java规范中描述了两种异常:
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
然而,在单线程下