我到处都找过,但找不到可靠的答案。根据文档,Java抛出一个java.lang.StackOverflowError 错误在以下情况下会出错:
当由于应用程序递归太深而发生堆栈溢出时抛出。
但这提出了两个问题:
- 除了递归之外,是否还有其他方式会导致堆栈溢出?
- StackOverflowError 是在 JVM 实际溢出堆栈之前还是之后发生?
详细说明第二个问题:
当Java抛出StackOverflowError时,您可以安全地假设堆栈没有写入堆吗?如果您在引发堆栈溢出的函数的 try/catch 中缩小堆栈或堆的大小,您可以继续工作吗?这有记录在任何地方吗?
我不是在寻找答案:
- StackOverflow 的发生是由于糟糕的递归。
- 当堆与栈相遇时,就会发生 StackOverflow。
看来你在想堆栈溢出错误就像本机程序中的缓冲区溢出异常一样,存在写入尚未分配给缓冲区的内存的风险,从而损坏其他一些内存位置。根本不是这样的。
JVM 为每个线程的每个堆栈分配了给定的内存,如果尝试调用方法恰好填满了该内存,JVM 就会抛出错误。就像您尝试在长度为 N 的数组的索引 N 处写入一样。不会发生内存损坏。堆栈不能写入堆。
StackOverflowError 对于堆栈就像 OutOfMemoryError 对于堆一样:它只是表示没有更多可用内存。
虚拟机错误的描述 (§6.3)
堆栈溢出错误:Java 虚拟机实现已耗尽线程的堆栈空间,通常是因为执行程序中出现错误而导致线程执行无限数量的递归调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)