繁体   English   中英

Java无限递归和StackOverflowError

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM