关于 Java VM 堆栈溢出

About Java VM Stack Overflow

谢谢!

我在学习JVM,测试VM栈溢出,发现一个奇怪的现象。 我通过两种方式递归调用方法,但我对结果感到困惑。

虚拟机选项:-Xss108k -Xms10m -Xmx10m

public class T2 {
    private int stackLength = 1;
    public void stackLeak(){
        long[] a = new long[2000]; //define this array or not
        stackLength++;
        stackLeak();
    }

    public static void main(String[] args) {
        T2 oom = new T2();
        try{ //
            oom.stackLeak();
        } catch(Throwable e){
            System.out.println("stack length: " + oom.stackLength);
            e.printStackTrace();
        } finally{

        }
    }


}

我已经重运行很多次了,结果都差不多。 我想,数组保存在堆中,它不会影响 VM 堆栈,但确实如此。

数组分配影响程序的执行时间。程序越长 运行s,JIT 编译器启动的机会就越大,程序将继续以编译模式执行。

堆栈深度的差异由后台JIT编译解释。有关详细信息,请参阅

为了进行公平比较,运行 JVM 关闭了 JIT 编译:-Xint。在这种情况下,数组分配将使最大递归深度预期更小(因为将多一个堆栈槽用于数组引用)。