try-catch语句中的递归调用

我有以下代码片段:

public static void main(String[] args) { foo(); } public static void foo() { try { foo(); } catch (Throwable t) { foo(); } } 

谁能解释一下这里发生了什么? 请详细说明。


我已经改变了这一部分并添加了println方法来展示一些东西:

 ... try { System.out.println("+"); foo(); } catch (Throwable t) { System.out.println("-"); foo(); } ... 

我得到这样的东西(过程没有停止):

 + + + + +-- +-- + +-- +-- + + +-- +-- + +-- +-- + + + +-- +-- 

foo可以退出的唯一方法是stackoverflow。 我们可以模拟效果

 public static void foo(int i) { if(i>=N) return; // stack too deep foo(i+1); foo(i+1); } 

这对于最大堆栈深度来说是指数级的。

在我的机器上,花费的时间约为6ns * 2^N

最大堆栈深度超过10,000,因此需要大约

  10000000000000000000000000000000 .... (thousands of zeros) ... 00000000000000000000000000000000 

多年来完成该计划,给予或采取一个恒定因素:)

你无限期地调用相同的方法。 这意味着将抛出StackOverflowError。

但是因为你正在捕捉它( StackOverflowError不是例外,它是java.lang.Error,这是一个java.lang.Throwable)应用程序不会停止,它会继续递归,它根本不会停止。

当我试图将堆栈大小减小到最小( -Xss160k -Xoss1k )时,它没有帮助。

我知道我没有解释为什么会发生这种情况,我需要对代码进行分析以获取更多信息,但这是一个有趣的问题,也许在JVM内部具有深厚专业知识的人确切知道发生了什么。