[英]Java endless recursion and StackOverflowError
抱歉,可能是一个愚蠢的问题,我是Java新手。
有没有办法在Java中进行无休止的递归,如下所示:
public void sillyMethod()
{
System.out.println(i);
i++;
sillyMethod();
}
它抛出StackOverflowError,但我真的想无休止地运行它。 有什么办法吗?
谢谢!
是和否,(但大多数情况下是不!!)
不,这是不可能的(最明智的答案):
对于每个调用,将有一个激活记录推送到JVM调用堆栈上。 这占用了非零的内存量,因此您有时会耗尽内存,此时将引发StackOverflowException。
是的,这是可能的(超理论答案):
Java语言规范中没有任何内容明确表明您最终应该遇到StackOverflowException。 这意味着,如果您找到一个足够多的cleaver编译器,则可能足够聪明,可以将其编译为循环 。
一个相关的问题是“ JVM是否支持尾调用优化”。 这个问题的答案是:“不,暂时不,但不排除在以后的版本中”。
如上述其他人所述,无限递归最终将导致堆栈溢出,至少就JVM实现而言。
您可以执行类似的操作,但与此类似,但是通过在旧线程终止之前产生新线程来避免堆栈扩展。
public class SillyClass implements Runnable {
private final int count;
public SillyClass(int cnt) {
this.count = cnt;
}
public static void main(String[] args) {
Thread t = new Thread(new SillyClass(0));
t.start();
}
@Override
public void run() {
System.out.println(count);
Thread t = new Thread(new SillyClass(count + 1));
t.start();
}
}
不是递归的,不。 它确实意味着创建了一个不断增加的调用堆栈,最终您将用光内存来容纳它。
使用Java,您将无法执行此操作。 但是,使用语言(尤其是Ocaml等功能性语言)进行尾部调用优化时,您可以执行此操作,因为它在内部将其变成了循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.