【发布时间】:2018-06-13 07:19:57
【问题描述】:
我在使用 setTimeout 时遇到了奇怪的内存泄漏。
我每 15 秒调用一次以下代码,并使用一个返回一组承诺 (Promise.all) 的异步函数,它应该在所有承诺解决并完成所有逻辑后再次运行 15 秒。
const schedule = (fn, seconds, runNow = false) => {
Meteor.setTimeout(() => {
try {
Promise.resolve(fn()).then(()=>{
schedule(fn, seconds, false)
}).catch((err)=>{
log.error(err)
schedule(fn, seconds, false)
})
} catch (e) {
log.error(e);
}
}, runNow ? 0 : seconds * 1000);
};
我已经尝试了 setTimeout 和上面的 Meteor.setTimeout 并且它们的行为相同,大约一个小时后你可以看到明显的内存泄漏。
值得一提的是,即使我禁用了我的代码并且被调用的函数只是返回,它仍然会泄漏。
服务器:OSX、Node 9.3、Meteor 1.6
发现很少有其他人使用 setTimeout 发生内存泄漏,但情况不同。
更新 问题是调度函数正在另一个我不知道的任务中被调用,并且一个异步代码非常繁重并且缺少等待,所以它在完成之前被重新调度,一段时间后它加起来。谢谢大家的回答。
【问题讨论】:
标签: javascript node.js meteor memory-leaks settimeout