JVM实战 OutOfMemoryError Java栈溢出

栈溢出分调用超出最大深度溢出和内存不足溢出,分别对应: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虚拟机》