为何该递归程序内存耗尽?栈溢出的内存占用原因解析
递归程序栈溢出的原因分析
你这段代码是无限递归,没有终止条件,每次调用neverEnd都会在内存的调用栈里新增一个栈帧,最终把栈空间撑爆导致溢出。
每个函数调用生成的栈帧里包含这些占用内存的内容:
- 返回地址:记录当前函数执行完后,要回到上一层代码的哪个位置继续执行(比如每次
neverEnd里调用完自身后,本来要回到console.log之后的位置,但因为无限递归,这个返回地址永远不会被用到) - 函数执行的上下文状态:比如调用前的寄存器值、栈指针位置等,用来保证函数返回后能恢复之前的执行环境
- 即便你这个函数没有定义局部变量和参数,栈帧本身的结构依然会占用固定的内存空间
调用栈的总内存是有限制的(不同运行环境下大小不同),无限递归会不断创建新栈帧,直到栈空间被彻底耗尽,最终触发栈溢出错误。
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

