Java学习之StackOverflowError和OutOfMemoryError两类错误的发生情形和原因。
StackOverFlowError(栈溢出)
-
原因: 线程请求的栈深度大于虚拟机所允许的最大深度
-
发生情形: 由于递归发生在一个单独的线程当中,当递归的深度增加时,递归栈的深度会增加,当应用程序递归得太深时,就会发生栈溢出。
-
举例分析:
public class StackOverFlow { private int i; public void plus() { i++; plus(); } public static void main(String[] args) { StackOverFlow stackOverFlow = new StackOverFlow(); try { stackOverFlow.plus(); } catch (Error e) { System.out.println("Error:stack length:" + stackOverFlow.i); e.printStackTrace(); } } }
程序输出的结果如下:
Error:stack length:997 java.lang.StackOverflowError at com.dxz.jvm.StackOverFlow.plus(StackOverFlow.java:11)
OutOfMemoryError(内存溢出)
-
原因: 当Java虚拟机因对象内存不足而无法分配对象,垃圾收集器无法提供更多内存时抛出。
-
发生情形: 当内存不足时,就会抛出该异常。
-
举例分析:
public class HeapOOM{ public static void main(String[] args){ List<HeapOOM> list = new ArrayList<HeapOOM>(); while(true){ list.add(new HeapOOM());//无限创建对象且使用集合保存其引用避免被回收 } } }
程序输出结果如下:
java.lang.OutOfMemoryError: Java heap space