在java语言中,使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出。
原因分析如下:
java虚拟机栈是线程私有,Java方法执行的内存模型是:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法对应一个栈帧,每个方法从调用到执行完成,对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
当线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
java虚拟机相关内容:《深入理解java虚拟机》系列1——java内存区域
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class RecursionTest { public static void recursion(int totalTimes,int time) { if(totalTimes > 1) { System.out.println("这是第 " + time + "次调用!"); totalTimes--; time++; recursion(totalTimes, time); } else { System.out.println("调用结束,共调用了" + time + "次"); return; } } public static void main(String[] args) { int totalTimes = 1000000; int time = 1; long startTime = System.currentTimeMillis(); System.out.println("嵌套调用起始时间:" + startTime); recursion(totalTimes, time); System.out.println("嵌套调用结束时间:" + System.currentTimeMillis()); System.out.println("总耗时:" + (System.currentTimeMillis() - startTime)); System.out.println("------------------------------------------------------------"); } } |