java - 什么是堆栈溢出错误?

标签 java exception memory-leaks out-of-memory stack-overflow

什么是StackOverflowError,是什么原因导致的,我应该如何处理它们?

最佳答案

参数和局部变量在堆栈上分配(对于引用类型,对象位于上,堆栈中的变量引用堆上的该对象) 。堆栈通常位于地址空间的上端,当它用完时,它会流向地址空间的底部(即趋向于零)。

您的进程还有一个,它位于进程的底部。当您分配内存时,该堆可能会向地址空间的上端增长。正如您所看到的,堆有可能与堆栈“碰撞”(有点像构造板 block !!!)。

堆栈溢出的常见原因是错误的递归调用。通常,这是由于递归函数没有正确的终止条件而导致的,因此它最终会永远调用自身。或者,当终止条件良好时,可能是由于在满足条件之前需要太多递归调用而导致的。

但是,通过 GUI 编程,可以生成间接递归。例如,您的应用程序可能正在处理绘制消息,并且在处理它们时,它可能会调用导致系统发送另一条绘制消息的函数。这里你没有明确地调用自己,但是操作系统/虚拟机已经为你完成了。

要处理它们,您需要检查您的代码。如果您有调用自身的函数,请检查您是否有终止条件。如果有,请检查在调用该函数时是否至少修改了参数之一,否则递归调用的函数将不会出现可见的更改,并且终止条件是无用的。另请注意,在达到有效的终止条件之前,您的堆栈空间可能会耗尽内存,因此请确保您的方法可以处理需要更多递归调用的输入值。

如果您没有明显的递归函数,请检查您是否正在调用任何间接会导致您的函数被调用的库函数(如上面的隐式情况)。

关于java - 什么是堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61492861/

相关文章:

oracle JDK 8 中的 JavaFx 是否与 openjfx 8 版本相同? oracle jdk 8中的javafx和openjfx8有什么关系?

java - 错误代码=-4220 且 SQLSTATE= null

java - 如何从oracle捕获自定义引发的异常到Java

c# - 分割 10k 页 PDF 时出现内存泄漏(iTextSharp PDF API)

java - 如何将多个带有标签的面板添加到单个框架中?

java - 你可以使 id 动态 - <div id=[此处动态字段]

java - 如何递归计算数字的平均值

java - http 请求后 GWT 中未捕获的异常

c++ - __thread C++ 内存泄漏

iphone - 应用程序中分配了很多内存,如何解决?