ide*_*no1 5 java stack-overflow recursion jvm try-finally
我有一个java程序,运行无限次.
程序代码:
void asd()
{
try
{
//inside try block
System.out.println("Inside try !!!");
asd();
}
finally
{
//inside finally
System.out.println("Inside finally !!!");
asd();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:通过不断打印两个系统,该程序无限运行.
我的问题:在某些时候,它开始从try块中抛出StackOverflowErrors,因此它到达finally块,我们再次以递归方式调用此函数.但是,当我们已经面临StackOverflowError时,finally块中的递归函数如何执行?
JVM如何处理这种情况?如果我们也得到OutOfMemoryErrors会发生同样的行为吗?
问题是你的示例程序是病态的。行不通,行不通。
但是,像我们已经面临的那样,finally 块中的递归函数是如何执行的呢
StackOverflowError?
正在进行一系列相当复杂的呼叫。假设堆栈可以容纳 3 个帧。“手动执行”为我们提供了一系列调用/调用堆栈快照,如下所示:
asd()
asd() > try
asd() > try > asd()
asd() > try > asd() > try
asd() > try > asd() > try > asd() // Stack Overflow!
asd() > try > asd() > finally
asd() > try > asd() > finally > asd() // Stack Overflow!
asd() > finally
asd() > finally > asd()
asd() > finally > asd() > try
asd() > finally > asd() > try > asd() // Stack Overflow!
asd() > finally > asd() > finally
asd() > finally > asd() > finally > asd() // Stack Overflow!
END
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在深度为 3 的堆栈中,我们进行了 7 次调用,其中 4 次因堆栈溢出而失败。如果您对深度为 4 的堆栈执行手工执行,您将获得 15 次调用,5 => 31。模式为N => 2**N - 1 calls。
在您的情况下,默认堆栈将能够容纳数百甚至数千个递归调用。
假设 N = 100。2**100 是一个非常大的调用次数。它不是无限的,但你可能会在程序终止之前死掉。
JVM如何处理这种情况呢?
如上。JVM 没有做任何特殊的事情。“有效的无限循环”行为完全取决于程序的编写方式。
OutOfMemoryError如果我们也得到 s也会发生同样的行为吗?
嗯...这取决于你的程序。但我确信您可以编写一个具有类似行为模式的示例程序。