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

用户名

我目前正在学习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);
    }
}

我的问题如下:

  • 在这个非常简单的示例的两次执行之间,是什么导致我的堆栈大小变化?
  • 如今,堆栈溢出是否总是由于不良的代码设计(例如,无限递归,过多的原语等)而发生,还是在现实世界中仍然存在堆栈技术限制的情况?
  • 这似乎很明显,但是..增加系统的物理内存是否还会增加堆栈的大小?
戴夫·牛顿

有限的堆栈大小是分配给JVM的内存量的函数。

资源受限的系统中有较少的内存可以被分配,所以绝对有现实世界的场景中栈的大小是一个限制,而有些情况下,你必须使用迭代解决方案,以自然递归问题,结果倍。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这会导致C堆栈溢出?

来自分类Dev

为什么以下原因堆栈溢出?

来自分类Dev

为什么会变成堆栈溢出?

来自分类Dev

为什么这会导致C堆栈溢出?

来自分类Dev

为什么在此DateTime中发生溢出?

来自分类Dev

为什么不溢出:隐藏工作?

来自分类Dev

防止堆栈溢出异常发生

来自分类Dev

为什么不总是使用RVO / NRVO?

来自分类Dev

为什么不总是使用std :: forward?

来自分类Dev

为什么不总是缓存委托实例?

来自分类Dev

为什么不总是四泵?

来自分类Dev

为什么不总是使用断言?

来自分类Dev

为什么不总是使用 EnableCrossPartitionQuery

来自分类Dev

为什么单行MySQL存储函数会使堆栈溢出?

来自分类Dev

为什么我在这里出现堆栈溢出?

来自分类Dev

为什么此F#表达式堆栈溢出

来自分类Dev

为什么阶乘不使Erlang中的堆栈溢出?

来自分类Dev

Haskell中的简单搜索树:为什么堆栈溢出?

来自分类Dev

为什么此Scala代码出现堆栈溢出错误?

来自分类Dev

为什么此循环会导致堆栈溢出?

来自分类Dev

为什么在使用异步操作时没有堆栈溢出?

来自分类Dev

为什么此Haskell代码会产生堆栈溢出?

来自分类Dev

为什么我遇到堆栈溢出错误

来自分类Dev

为什么这会为我提供堆栈溢出错误?

来自分类Dev

为什么会出现堆栈溢出错误?

来自分类Dev

为什么此F#表达式堆栈溢出

来自分类Dev

为什么`pushd`总是将堆栈输出到stdout?

来自分类Dev

为什么构造函数总是在堆栈上调用?

来自分类Dev

为什么缓冲区溢出发生?