在得到StackOverflowError之前,我需要多深入调用堆栈?答案平台是否依赖?
答案 0 :(得分:55)
这取决于分配给堆栈的虚拟内存量。
http://www.odi.ch/weblog/posting.php?posting=411
您可以使用-Xss
VM参数或Thread(ThreadGroup, Runnable, String, long)
构造函数对此进行调整。
答案 1 :(得分:24)
我在我的系统上测试过并没有找到任何常量值,有时在8900次调用后发生堆栈溢出,有时仅在7700次后随机数字。
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
答案 2 :(得分:19)
可以使用-Xss
命令行开关设置堆栈大小,但根据经验,它足够深,数百甚至数千个调用深度。 (默认值取决于平台,但在大多数平台上至少为256k。)
如果堆栈溢出,99%的时间是由代码中的错误引起的。
答案 3 :(得分:3)
比较这两个电话:
(1)静态方法:
RowDefinition
(2)使用不同类的非静态方法:
public static void main(String[] args) {
int i = 14400;
while(true){
int myResult = testRecursion(i);
System.out.println(myResult);
i++;
}
}
public static int testRecursion(int number) {
if (number == 1) {
return 1;
} else {
int result = 1 + testRecursion(number - 1);
return result;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 62844
测试递归类有public static void main(String[] args) {
int i = 14400;
while(true){
TestRecursion tr = new TestRecursion ();
int myResult = tr.testRecursion(i);
System.out.println(myResult);
i++;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 14002
作为唯一的方法。