我有以下代码片段:
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();
}
...
我得到了这样的东西(这个过程还没有停止):
+
+
+
+
+--
+--
+
+--
+--
+
+
+--
+--
+
+--
+--
+
+
+
+--
+--
发布于 2015-08-31 12:47:19
foo
可以退出的唯一方法是堆栈溢出。我们可以通过
public static void foo(int i)
{
if(i>=N) return; // stack too deep
foo(i+1);
foo(i+1);
}
这是指数昂贵的w.r.t的最大堆栈深度。
在我的机器上,花费的时间是关于6ns * 2^N
的
最大堆栈深度超过10,000,所以大约需要
10000000000000000000000000000000
....
(thousands of zeros)
...
00000000000000000000000000000000
完成程序的时间,给予或接受一个不变的因素:)
发布于 2015-08-31 12:57:38
您正在无限期地调用相同的方法。这意味着将抛出a StackOverflowError。
但是,由于您正在捕获它(StackOverflowError不是一个例外,它是java.lang.Error,它是一个java.lang.Throwable)应用程序不会停止,它将继续递归,它根本不会停止。
当我试图将堆栈大小减小到最小(-Xss160k -Xoss1k
)时,没有帮助。
我知道我没有解释为什么会发生这种情况,为了获得更多的信息,我需要分析代码,但是这是一个有趣的问题,也许在JVM内部有很深的专业知识的人确切知道发生了什么。
https://stackoverflow.com/questions/32319161
复制相似问题