含await的JavaScript无限循环引发内存泄漏问题咨询
含await的JavaScript无限循环引发内存泄漏问题咨询
看起来你这个简化后的代码本身在现代JavaScript引擎里其实不太会直接导致内存泄漏,但结合你说的实际是轮询Redis列表的场景,大概率是你去掉的那些“干扰代码”里藏着问题,我来帮你拆解下可能的原因,以及排查方向:
- 未清理的持久化引用:如果每次轮询Redis时,你创建了一些对象(比如请求实例、临时缓存的数据、事件监听器),然后把它们存在了全局数组、Map或者闭包持有的变量里,没有在轮询完成后及时移除或释放,这些对象就会一直被GC标记为活跃,慢慢积累导致内存泄漏。
- 未处理的Promise拒绝:如果你的Redis请求偶尔失败,而你没有用
try/catch包裹await的Redis调用,未被捕获的Promise拒绝会让相关的Promise链、请求上下文一直保留在内存中,无法被回收。 - Redis客户端的连接复用问题:如果每次轮询都新建一个Redis客户端实例,而没有复用单例或者在使用后正确关闭连接,这些未关闭的连接会持有资源,导致内存占用持续上升。
- 至于你简化代码里的
setTimeout+await逻辑,其实每次循环的Promise在resolve后,定时器会被引擎清理,Promise也会进入完成状态,调用栈会被清空,单纯这个无限循环本身不会造成内存泄漏,可以排除这个点。
给你个排查小建议:你可以用Node.js的--inspect参数启动服务,配合Chrome DevTools的内存面板,每隔几次轮询就拍一次内存快照,对比快照里增长最快的对象类型,就能定位到具体是哪部分代码在“偷偷”保留内存了。另外也可以逐步把你去掉的Redis相关代码加回来,每次只加一部分,观察内存变化,这样更容易找到泄漏点。
备注:内容来源于stack exchange,提问作者DebD
相关产品推荐
相关产品推荐

