为什么不总是发生堆栈溢出?

6 java memory stack-overflow

我正在学习Java,作为我学习的一部分,我试图故意引起堆栈溢出,看看它会做什么.

我做了一些边界测试,有趣的是,我发现如果我执行以下代码,它只会偶尔导致错误.有时它会毫无问题地运行.

public class SO
{
    public static void main(String[] args)
    {
        ohno(0);
    }

    public static void ohno(int a)
    {
        System.out.println(a);
        if (a != 11413)
            ohno(a+1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 什么可能导致我的堆栈大小在这个非常简单的例子的执行之间变化?
  • 现在,由于代码设计不当(即无限递归,过大的基元等),是否总是会发生堆栈溢出,或者是否存在堆栈仍然是技术限制的真实场景?
  • 这个看起来很明显,但是..增加系统的物理内存是否也增加了堆栈的大小?

Dav*_*ton 3

有限的堆栈大小取决于分配给 JVM 的内存量。

资源受限的系统分配的内存较少,因此在现实场景中绝对存在堆栈大小受到限制的情况,有时您必须使用迭代解决方案来解决自然递归问题。

仅当您允许 JVM 分配内存时,增加系统的物理内存才有意义,否则您将获得该平台的默认值。