我有一个自己调用的代码(java)..当它没有得到一些值时。
public void recfunction() {
---do something----
if not found a then
call recFunction();
if found a save a and then exit the function.
}
recfunction本身最多可调用5次。我得到了" a" 5次以内。如果我运行此函数1000次,我会得到StackOverflowError吗?
编辑:我想问的是当函数退出时......将删除所有调用的Stack帧。
答案 0 :(得分:0)
你可以尝试并发现,但不是,只要它正在执行实际代码并保持在堆栈限制内,它就不会。 java中的堆栈大小是400k,所以只要你没有在每次调用中跟踪大量的varas就应该没问题。
如果它在投掷stackoverflower之前只运行了5次,那是因为你超过了堆栈。
答案 1 :(得分:0)
您问题的具体答案是,"它取决于。"
但总的来说,是的,运行amok的递归函数会导致堆栈溢出错误。
特别是在Java中,您可以控制堆栈大小。因此,您可以使用更小或更大的堆栈启动JVM,这显然会影响堆栈溢出的数量。
此外,您在函数中分配的本地存储量将有所贡献。如果你的函数根本不使用任何堆栈 - 只需调用自身并可能递减一个计数器 - 你将不得不使用只有返回地址指针和基本堆栈帧数据的堆栈。 / p>
但是如果在每个本地堆栈帧中分配一个1000个元素的对象数组,那么显然你将消耗更多的堆栈"每个调用",因此你可以用更少的递归级别溢出堆栈。
答案 2 :(得分:0)
首先,该代码显然不会编译,更不用说运行......
其次,假设它已编译,你可以编译并运行它。
最重要的是,如果您要在多个配置上运行它,您会发现不同的答案。例如,请参阅this question:
java -Xss4m Test
这会将堆栈大小增加到4兆字节。