虚拟机栈的大小 & 方法嵌套调用的深度

虚拟机栈的大小 & 方法嵌套调用的深度

每当调用一个方法,就将它的栈帧入栈,如果这个方法嵌套的调用了另一个方法,那么将那个方法的栈帧入栈。

可以嵌套调用多少层?

使用一个递归的调用,来计算嵌套调用的层数。

package JVMStack.size;

public class DeepTest {

    static int deep = 0;

    public static void test() {
        deep++;
        test();
    }

    public static void main(String[] args) {
        try {
            test();
        } catch(StackOverflowError e) {//捕获栈溢出的异常
            System.out.println(deep);
        }
    }
}

运行结果:

                                               

可以看到,总共递归调用了22260次,也就是说test()方法对应的栈帧进行了22260次入栈操作,导致虚拟机栈的空间不够,发生溢出

所以,可以通过改变虚拟机栈的大小来改变嵌套的深度。

使用-Xss<size>的选项,设置虚拟机栈的大小

                

设置完栈的大小之后,明显的看到嵌套层数减少了非常多,因此,①虚拟机栈的大小是影响嵌套深度的原因之一;②不能忽略栈帧本身的大小,栈帧的越大,则占用的虚拟机栈的空间就大,也会影响嵌套的深度。

发布了213 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/104061256
今日推荐