java try-catch-finally递归问题

qkp*_*kpk 4 java recursion finally try-catch

public class Foo {

    public static void main(String[] args) {
        foo();
    }

    public static void foo() {
        try {
            System.out.println("try");
            foo();
        } catch (Throwable e) {
            System.out.println("catch");
            foo();
        } finally {
                System.out.println("finally");
                foo();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这段代码的输出?

1.在eclipse(无尽)客户端模式下输出:


    try
    try
    ....


    ...
    ...
    tryfinallyfinally
    tryfinallyfinally
    try
    try
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    ....
    ....

2.output on linux(crash)服务器模式:


    try
    try
    ...

    ...
    try
    try
    try
    try
    try
    try
    MISSING EXCEPTION HANDLER for pc 0x00002aaaab1c53f0 and handler bci -1
       Exception:

     Compiled exception table :
    ExceptionHandlerTable (size = 3304 bytes)
    catch_pco = 700 (1 entries)
      bci -1 at scope depth 0 -> pco 11039
    catch_pco = 1736 (1 entries)
      bci -1 at scope depth 0 -> pco 11473
    catch_pco = 1756 (1 entries)
      bci -1 at scope depth 0 -> pco 11433
    catch_pco = 1776 (1 entries)

Mic*_*rdt 8

我想我从"Java Puzzlers"一书中记得这一点.try块执行无限递归,很快导致抛出StackOverflowError.try和catch块恢复递归,但剩余堆栈相应较小.但是,当每个递归调用返回时,剩余的堆栈会再次变大...

最终结果是一个调用图,它根据堆栈的大小形成一个深度为树的树; 与主流的JVM的默认堆栈大小的树变得如此之大,你就必须等待许多,许多数十亿年,它完全运行和程序终止.

编辑:这就是您在客户端模式中看到的内容:遍历调用图.您在Linux服务器模式下看到的是JVM错误或硬件缺陷(错误的RAM可能会产生这种影响).