虚拟机栈的大小 & 方法嵌套调用的深度
每当调用一个方法,就将它的栈帧入栈,如果这个方法嵌套的调用了另一个方法,那么将那个方法的栈帧入栈。
可以嵌套调用多少层?
使用一个递归的调用,来计算嵌套调用的层数。
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>
的选项,设置虚拟机栈的大小
设置完栈的大小之后,明显的看到嵌套层数减少了非常多,因此,①虚拟机栈的大小是影响嵌套深度的原因之一;②不能忽略栈帧本身的大小,栈帧的越大,则占用的虚拟机栈的空间就大,也会影响嵌套的深度。