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

标签 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);
    }
}

我的问题如下:

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

最佳答案

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

资源受限的系统可以分配的内存较少,因此在现实世界中绝对存在堆栈大小受限的情况,有时您必须自然地使用迭代解决方案-结果是递归问题。

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

关于java - 为什么不会总是发生堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995859/

相关文章:

c - 跨 exec 调用共享内存

javascript - IE 递归中的堆栈溢出 -> window.frames 不等于自身

java - J2ME标签问题

c++ - 通过 delete operator 调用我的全局 operator delete

java - Elasticsearch 中的聚合解析

ios - 关于Xcode内存使用的困惑,Activity Monitor的真实内存

android - 2 EditText + 2 TextWatcher - 计算器错误

JavaFX:将 List<A> 双向绑定(bind)到 List<B> 会抛出 StackOverflowError

Java Swing : why must resize frame, 以便可以显示已添加的组件

java - 静态方法错误