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

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

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

最佳答案

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

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

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

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

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

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

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

相关文章:

java - 如何将元素放入字符串数组中?

java - 如何使用一个月的单个日期作为条件

java - 如何测试任何方法调用是否抛出异常?

java - 如何获取当前周和月的第一天?

exception - Fortran 中是否存在异常处理?

Ruby 异常或错误?

c++ - 我如何让连续内存以安全的方式表现出多态性?

ios - 在iPhone应用程序中运行时进行内存泄漏检测

ssl - boost::asio::ssl 内存泄漏,即使使用 boost::asio::ssl 示例

java - 为什么这个类方法返回 'null' ?