如何最终阻止jvm中的每次运行


void tryCatchFinally() {
try {
tryItOut();
} catch (TestExc e) {
handleExc(e);
} finally {
wrapItUp();
}

Method void tryCatchFinally()                                                                 
0   aload_0             // Beginning of try block
1   invokevirtual #4    // Method Example.tryItOut()V
4   goto 16             // Jump to finally block
7   astore_3            // Beginning of handler for TestExc;
// Store thrown value in local var 3
8   aload_0             // Push this
9   aload_3             // Push thrown value
10  invokevirtual #6    // Invoke handler method:
// Example.handleExc(LTestExc;)V
13  goto 16             // This goto is unnecessary, but was
// generated by javac in JDK 1.0.2
16  jsr 26              // Call finally block
19  return              // Return after handling TestExc
20  astore_1            // Beginning of handler for exceptions
// other than TestExc, or exceptions
// thrown while handling TestExc
21  jsr 26              // Call finally block
24  aload_1             // Push thrown value...
25  athrow              // ...and rethrow value to the invoker
26  astore_2            // Beginning of finally block
27  aload_0             // Push this
28  invokevirtual #5    // Method Example.wrapItUp()V
31  ret 2               // Return from finally block
Exception table:
From    To      Target      Type
0       4       7           Class TestExc
0       16      20          any

你好,我们有一个方法,正如我们在上面的代码中指定的。你可以在下面看到这个代码的字节码输出

我的问题是…如果tryItOut((方法得到一个stackerflow错误。Jvm如何最终阻止并返回。我们已经没有记忆了。jvm中如何处理此过程。

假设堆栈上已经有50个方法,然后调用一些递归代码,如下所示:

try {
recursiveCall();
} catch (StackOverflowError e) {
...
}

这种递归方法深入了大约40个层次,然后就出现了SOErrs。

这意味着所有40个方法最终都会被"分解"(堆栈上这40个方法中的每一个都以可丢弃的方式返回(,然后它会到达您的catch块。现在这个堆栈上有大约40种方法的操作空间,你会没事的。

在一个有点奇怪的场景中,堆栈几乎满了,您甚至调用了一个方法,这会导致您立即捕获的SOErr,您会受到很大的阻碍;在catch (StackOverflowError e)处理程序中,您尝试做的大多数事情本身都会抛出该异常,而try/catch块本身并不适用,因此它只会出现气泡,在执行过程中分解方法,从而创建空间。

CCD_ 2也不例外。除非[A]try块正常完成,或者[B]它抛出了一些东西,可选地到达某个异常处理程序(它也必须完成(,然后它到达finally,否则你不会到达finally。换句话说,如果由于StackOverflowError而导致finally块,问题出在哪里?现在有一大堆房间可用,SOER沿着烟囱向上移动,一边移动一边腾出空间。

最新更新