【问题标题】:StackOverflowException堆栈溢出异常
【发布时间】:2023-07-08 01:11:01
【问题描述】:

*Exception 是硬编码抛出的条件还是依赖于代码运行的机器?

我几乎可以肯定后者,但我的搜索失败了,并且在这里没有提出足够的问题。

【问题讨论】:

  • 条件到底是什么意思?当堆栈已满并且方法尝试在堆栈上分配更多空间来保存局部变量时抛出它,并且失败。具体来说,是“Localloc”IL 操作码抛出了这个。
  • 我的意思是,如果堆栈被填充的时间是否有硬限制,或者它是内存的其他百分比还是当前机器的其他比例?

标签: .net exception specifications stack-overflow


【解决方案1】:

来自the documentation

...当执行堆栈溢出时抛出,因为它包含太多的嵌套方法调用。

由于堆栈的大小取决于体系结构,甚至可以在机器上被覆盖,是的,这个值不是硬编码的,尽管它在 Windows 上通常是相当静态的。如果我没记错的话,默认是1MB。

【讨论】:

    【解决方案2】:

    虽然不是您的问题的完美匹配,但另请参阅:

    How do you change default stack size for managed executable.net

    【讨论】:

      【解决方案3】:

      堆栈帧会因操作系统的寻址模式而异。我相信 x64 使用稍大的堆栈帧。请记住,进程空间能够比 x86 增长得更多,因此总体而言,如果 RAM 和交换文件大小不是问题,您应该能够将堆栈配置为在 x64 上接受更多帧。

      【讨论】:

        【解决方案4】:

        执行堆栈溢出时抛出的异常,因为它包含太多的嵌套方法调用。这个类不能被继承MSDN

        我尝试了这个code 并进行了一些更改。我根据我的经验更改上述说法

        Framework 4.0 执行堆栈溢出时抛出的异常,因为它包含7573个嵌套方法调用。这个类不能被继承。

        Framework 2.0 执行堆栈溢出时抛出的异常,因为它包含7038个嵌套方法调用。这个类不能被继承。

        【讨论】: