当我使用setTimeout时,我遇到了奇怪的内存泄漏。
我每隔15秒使用一个返回Promise数组的异步函数(Promise.all)调用以下代码,并且它应该在所有promise已经解决并且完成所有逻辑后15秒再次运行。 / p>
我已经尝试了setTimeout和上面的Meteor.setTimeout并且它们的行为相同,一小时左右后你可以看到明显的内存泄漏。
值得一提的是,即使我禁用了我的代码并且被调用的函数刚刚返回,它仍然会泄漏。
服务器:OSX,Node 9.3,Meteor 1.6
发现很少有其他人在使用setTimeout但不同的情况下发生内存泄漏。
更新 问题是调度函数是在另一个我不知道的任务中被调用的,并且一个人有非常繁重的异步代码并且没有等待,因此它在完成之前被重新安排,并且在一段时间后它会加起来。谢谢你的所有答案。
答案 0 :(得分:1)
如果你摆脱了try catch会怎样?
const schedule = (fn, seconds, runNow = false) => {
Meteor.setTimeout(() => {
Promise.resolve()
.then(fn)
.then(
()=>
schedule(fn, seconds, false)
)
.catch((err)=>{
log.error(err)
schedule(fn, seconds, false)
});
}, runNow ? 0 : seconds * 1000);
};
我不确定为什么你有一个尝试和捕获,我认为fn是一个可以抛出错误并且不返回一个承诺的函数(如果它确实不会抛出并拒绝)。 / p>
对于可以在promise链中使用的函数,你只需将它们放在的promise链中。 Promise.resolve(fn())不会把它放在链中但Promise.resolve()。then(fn)会。
var fn = function(){throw("Not caught in promise")};
var fn = function(){throw("Not caught in promise")};
Promise.resolve().then(fn)
.catch(e=>console.log("============ is caught"));
Promise.resolve(fn())
.catch(e=>console.log("not caught"));

答案 1 :(得分:0)
我不确定这是否是解决方案,但在ReactJS FAQ中有一个名为Arrow Function in Render的主题,其中包括:
在渲染中使用箭头功能每次创建一个新函数 组件渲染,可能会影响性能(见下文)。
也许这就是这种情况?
值得一提的是,即使我禁用了我的代码并且被调用的函数刚刚返回,它仍然会泄漏。
PS:也许你可以添加仍然泄漏的最小代码示例?