当前位置: 首页 > 面试题库 >

究竟是什么导致堆栈溢出错误?

经昱
2023-03-14
问题内容

我到处都是,找不到可靠的答案。根据文档,在以下情况下,Java引发java.lang.StackOverflowError错误:

由于应用程序递归过深而在堆栈溢出时抛出。

但这提出了两个问题:

  • 不仅通过递归,还有其他方法可以使堆栈溢出吗?
  • 是在JVM实际溢出堆栈之前还是之后发生StackOverflowError?

详细阐述第二个问题:

当Java引发StackOverflowError时,您是否可以安全地假设堆栈未写入堆中?如果您在尝试引发堆栈溢出的函数中进行尝试/捕获来缩小堆栈或堆的大小,那么您可以继续工作吗?这在任何地方都有记录吗?

我不需要的答案:

  • 由于错误的递归,导致发生StackOverflow。
  • 当堆遇到堆栈时,将发生StackOverflow。

问题答案:

似乎您在考虑一个堆栈溢出错误,就像本机程序中的缓冲区溢出异常一样,这是因为存在写入尚未分配给该缓冲区的内存的风险,从而损坏了其他一些内存位置。根本不是这样。

JVM为每个线程的每个堆栈分配了给定的内存,并且如果尝试调用方法的尝试恰好填充了该内存,则JVM会引发错误。就像您尝试在长度为N的数组的索引N处写入时一样。不会发生内存损坏。堆栈无法写入堆。

一个StackOverflowError对于堆栈来说就是一个OutOfMemoryError对堆:它只是表示没有更多可用的内存。

虚拟机错误说明(§6.3)

Java虚拟机实现已为线程耗尽了堆栈空间,通常是由于执行程序中的错误导致线程正在进行无数次的递归调用。



 类似资料:
  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 问题内容: 它与jQuery有何关系?我知道该库在内部使用本机javascript函数,但是每当出现此类问题时,它到底想做什么? 问题答案: 这意味着您已尝试将DOM节点插入到DOM树中无法移动的位置。我在Safari上看到的最常见的地方不允许以下内容: 通常,这只是实际意图中的一个错误: 常见的其他原因(从评论中总结): 您正在尝试将节点附加到自身 您正在尝试将null附加到节点 您试图将一个节

  • 问题内容: TL; DR: 将任何非内置函数添加到Array.prototype AND Function.prototype将导致IE8本机JSON解析器在解析包含数组的任何JSON时发生堆栈溢出,但仅当您还传递了reviver函数时放入JSON.parse()。 最初这是一个问题,但我回答了我自己的原始问题,所以现在我要问:有人能想到此IE8错误的解决方法,该方法不涉及消除所有修改Array.

  • 我有一个名为User的实体,它有一组角色。我还有一个角色实体,它有一组用户。(这只是出于学习目的的实践应用。) 问题是——我有一个UserController(REST API)来发送用户列表——这会导致StackOverFlow错误。用户试图加载角色,而角色又试图加载用户等。 我的问题是——如何避免这种情况?我也看到许多类似的设计。例如:https://viralpatel.net/blogs/

  • 我正在使用一个正则表达式从任意长的输入字符串中提取键值对,并且遇到了这样的情况:对于具有重复模式的长字符串,它会导致堆栈溢出。 KV解析代码如下所示: 一些虚构的输出示例: 我显式地将generic放在上面,而不是在解析之前检查最大字符串长度的hacks(例如)。 我能想出的最粗俗的解决方法,一个真正的反模式,是 有趣的是,它在我试过的几次运行中都起作用了,但它不是一个值得推荐的有品位的东西。:-

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。