什么是StackOverflowError
,是什么引起的,我应该如何处理?
最佳答案
参数和局部变量在堆栈上分配(使用引用类型,对象位于堆上,并且堆栈中的变量在堆上引用该对象)。堆栈通常位于地址空间的上末端,用完后,将朝向地址空间的底部(即朝向零)。
您的流程还具有堆,它位于流程的底部末尾。分配内存时,此堆可能会朝地址空间的高端增长。如您所见,堆有可能与堆栈“碰撞” (有点像构造板块!!!)。
堆栈溢出的常见原因是错误的递归调用。通常,这是由于您的递归函数没有正确的终止条件而导致的,因此最终将永远调用自身。或者,当终止条件很好时,可能是由于在实现之前需要太多的递归调用引起的。
但是,使用GUI编程,可以生成间接递归。例如,您的应用程序可能正在处理绘画消息,并且在处理它们时,它可能会调用使系统发送另一个绘画消息的函数。在这里,您没有明确地称呼自己,但是OS/VM已经为您做到了。
要处理它们,您需要检查您的代码。如果您有调用自己的函数,请检查是否有终止条件。如果有,请检查在调用该函数时是否至少已修改其中一个参数,否则递归调用的函数将无可见更改,并且终止条件无用。另外请注意,在达到有效的终止条件之前,堆栈空间可能会耗尽内存,因此请确保您的方法可以处理需要更多递归调用的输入值。
如果没有明显的递归函数,请检查是否正在调用间接由间接引起的函数调用的任何库函数(如上述隐式情况)。