递归的深度
在使用递归的时候经常会抛出StackOverflowError,顾名思义就是栈满了,而我们这里所说的栈在java中通常就是虚拟机栈(vm stack),在每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈,动态链接,方法出口等信息,每一个方法从调用直到执行结束的过程就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
虚拟机栈的深度是固定的,所以虚拟机栈中所装的栈帧的多少取决于栈帧的大小,而栈帧的大小就取决于
局部变量表、操作数栈,动态链接,方法出口四个的大小,而我们最熟悉的应该是局部变量表,用于存储方法中定义的局部变量的,因此局部变量越多栈所能装下的栈帧也就越少。写个程序验证一下:
//局部变量表大的方法
public void large(int a) {
try {
//使用随机数确保每一个字符串都不相同,效果更明显
String b = String.valueOf(100* Math.random());
String c = String.valueOf(100* Math.random());
String d = String.valueOf(100* Math.random());
String e = String.valueOf(100* Math.random());
String f = String.valueOf(100* Math.random());
String g = String.valueOf(100* Math.random());
a++;
large(a);
} catch (StackOverflowError error) {
System.out.println("large方法 " + a + " 层");
}
}
//局部变量表小的方法
public void small(int a) {
try {
a++;
small(a);
} catch (StackOverflowError error) {
System.out.println("small方法" + a + " 层");
}
}
分别运行large方法和small方法,运行结果如下:
从结果来看,差距还是挺明显的。