← 中文资源

简体中文版本

Java 因失控递归抛 StackOverflowError

找出 StackOverflowError 背后的无界递归并改为迭代或有界深度。

阅读英文原文

症状

运行时抛出 StackOverflowError,堆栈重复同一方法或两个方法交替出现。这说明递归无界:要么基准条件缺失或不可达,要么数据成环导致 toString、equals 或序列化无限递归。即使基准正确,有限但极深的结构也可能耗尽栈。

诊断

读取重复帧定位递归调用;检查基准条件;对对象图方法检查是否处理环。

App 2>&1 | grep -A5 StackOverflow | head -20

根因

递归下降时未到达终止的基准条件,耗尽线程栈,原因是基准条件错误,或数据含环或深度过大。

修复

先修正基准条件,因为加大栈只会推迟失败;把深递归改为带显式栈的迭代;对图遍历加入环检测或基于恒等性的处理。只有深度合理且有限时才用更大的线程栈。

验证

用此前失败的输入重跑确认完成,再测一个成环或深嵌套用例确认新的处理生效。两者兼备说明递归已受控。

常见陷阱

仅靠 -Xss 加大栈会掩盖逻辑缺陷并在更深的输入上再次崩溃;应修正递归终止。