java的虚拟机栈中可能会存在java.lang.StackOverflowError这个错误,本例中通过方法的递归来模拟出该异常,进而研究其细节。

测试例子:

 1package test.heap;
 2
 3public class TestStack {
 4    private int len;
 5    public static void main(String[] args) {
 6        TestStack stack = new TestStack();
 7        try {
 8            stack.test();
 9        } catch (Throwable e) {
10            e.printStackTrace();
11            System.out.println("len=" + stack.getLen());
12        }
13    }
14    void test() {
15        this.len++;
16        test();
17    }
18    int getLen() {
19        return this.len;
20    }
21}

执行结果如下:

 1java.lang.StackOverflowError
 2	at test.heap.TestStack.test(TestStack.java:16)
 3	at test.heap.TestStack.test(TestStack.java:16)
 4	at test.heap.TestStack.test(TestStack.java:16)
 5	at test.heap.TestStack.test(TestStack.java:16)
 6	at test.heap.TestStack.test(TestStack.java:16)
 7	at test.heap.TestStack.test(TestStack.java:16)
 8	at test.heap.TestStack.test(TestStack.java:16)
 9	at test.heap.TestStack.test(TestStack.java:16)
10	at test.heap.TestStack.test(TestStack.java:16)
11len=11116
12
13Process finished with exit code 0

栈的默认大小一般1M或者几百k,通过-Xss参数可以指定。如:-Xss100k