无限while循环调用Promise.then触发堆内存溢出的原因求解
问题原因分析
- 事件循环执行顺序限制:JavaScript 采用单线程事件循环模型,同步任务的执行优先级高于所有微任务,
Promise.then注册的回调属于微任务,会被推入微任务队列等待所有同步任务执行完成后才会调度。代码中的while(true)是无限运行的同步死循环,会持续占用主线程,导致所有then回调永远得不到执行,自然不会输出任何内容。 - 内存持续溢出的核心原因:每次循环调用
promise.then()都会创建一个全新的 Promise 实例以及对应的回调函数对象,这些对象都会占用 V8 引擎分配的堆内存。由于主线程始终被同步死循环占用,垃圾回收器没有运行窗口,不断生成的对象无法被回收,堆内存占用会持续攀升,直到超过引擎的内存配额,触发堆内存溢出报错。 - 补充说明:即使不存在同步死循环阻塞,当前代码的
.then((v) => v)也不会输出 4,回调仅将参数原值返回,没有执行console.log(v)打印逻辑。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

