我想知道java.lang.StackOverflowError的根本原因是什么。我知道当方法被递归调用无限次时就会发生这种情况,但是异常的实际原因是什么,默认的堆栈大小是多少?
发布于 2014-02-27 19:46:49
它不一定只有在递归调用的情况下才会抛出。只要堆栈内存空间被堆栈上的典型数据填充:局部变量、局部参数等,就会抛出异常。
显然,获得堆栈溢出错误的机会随着堆栈的大小(当前正在执行的方法和线程的根之间有多少个方法调用)和活动线程的数量而增加。
但是,正如我所提到的,递归调用并不是获得大型堆栈的唯一原因。
发布于 2014-02-27 19:53:56
根本原因是:堆栈大小在运行时是固定的(),一旦程序运行,VM就不提供调整它的方法。但是递归深度不是固定的,在很多情况下它依赖于输入数据。这就是为什么递归深度有时会导致不是所有堆栈帧都适合堆栈的原因。
发布于 2014-02-27 19:44:23
每当内存的特定部分(“堆栈”)耗尽时,就会发生堆栈溢出错误。基本上,你已经用完了分配给你的程序的内存,通常没有请求任何额外的内存,所以你的程序崩溃了。
具体地说,堆栈用于与调用函数和线程相关的所有事情,因此在理论上,您甚至可以通过创建一个新线程来耗尽内存(尽管您首先需要用函数调用几乎填满它)。此外,递归不需要是无限的,只要非常大即可。
public int foo(int i){
if (i=0)
return 0;
return (foo(i-1)+foo(i-1)%1000);
}然后调用foo (10000)会导致堆栈溢出,而不是无限的。
如果你对了解堆栈更感兴趣,我会建议你在更低级的语言中递归是如何工作的,比如汇编,在这种语言中,你可以真正看到你的机器在做什么(注意,学习这一点需要相当多的费用,但会让你成为一名更好的程序员)。
https://stackoverflow.com/questions/22067414
复制相似问题