栈溢出分调用超出最大深度溢出和内存不足溢出,分别对应:StackOverflowError和OutOfMemoryError。但这两种异常其实反应的是一个问题,那就是stack内存不足。
栈溢出的问题,有一定编程经验的开发者可能马上想到对应的场景,那就是无限制的递归,无限制递归也就是不停调用同一函数,压入栈中,最终导致栈内存不足,从而抛出StackOverflowError错误。
我们来模拟一下StackOverflowError
代码如下:
/**
* www.itzhimei.com
* 编程技术之美-IT之美
*/
public class StackSOF {
private int len = 0;
public void stackAdd() {
len++;
//调用自身,实现递归效果,只是这个递归没有退出条件,那么肯定会发生栈溢出
stackAdd();
}
public static void main(String[] args) {
StackSOF sof = new StackSOF();
sof.stackAdd();
}
}
JVM参数:
-Xss64k
Exception in thread "main" java.lang.StackOverflowError
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:10)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
at com.itzhimei.study.jvm.StackSOF.stackAdd(StackSOF.java:12)
......
......
at com.itzhimei.study.jvm.StackSOF.main(StackSOF.java:17)
内容学习自周志明老师的《深入理解Java虚拟机》