什么事实导致堆栈溢出错误?

问题:

我看到无处不在,找不到一个坚实的答案。根据文档,Java在以下情况下会引发java.lang.StackOverflowError错误:

当堆栈溢出发生时抛出一个应用程序递归太深。

但这提出了两个问题:

  • 不存在堆栈溢出发生的其他方式,不仅通过递归?
  • StackOverflowError是否在JVM实际上溢出堆栈之前发生?

详细说明第二个问题:
当Java抛出StackOverflowError时,你可以放心地认为堆栈没有写入堆中吗?如果您在堆栈溢出功能的try / catch中缩小堆栈或堆的大小,可以继续工作吗?这是记录在哪里吗?
答案我不是在寻找:

  • StackOverflow由于不好的递归而发生。
  • 当堆满足堆栈时,会发生StackOverflow。

回答:

看来,您认为stackoverflow error就像本机程序中的缓冲区溢出异常,当存在尚未分配给缓冲区的内存的风险,从而损坏其他内存位置。根本不是这样。
JVM为每个线程的每个堆栈分配了一个给定的内存,并且如果尝试调用方法发生填充此内存,JVM会引发错误。就像在尝试在长度为N的数组的索引N上写入时一样。不会发生内存损坏。堆栈不能写入堆中。
StackOverflowError是堆栈的一个OutOfMemoryError到堆栈:它只是表示没有更多的内存可用。

虚拟机错误说明(§6.3)

 的StackOverflowError:Java虚拟机实现的线程已经用尽了堆栈空间,通常是因为执行程序中的线程正在执行无限次的递归调用。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What actually causes a Stack Overflow error?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

35 − = 29