Node(Meteor)中的setTimeout内存泄漏

时间:2018-01-03 15:29:19

标签: javascript node.js meteor memory-leaks settimeout

当我使用setTimeout时,我遇到了奇怪的内存泄漏。

我每隔15秒使用一个返回Promise数组的异步函数(Promise.all)调用以下代码,并且它应该在所有promise已经解决并且完成所有逻辑后15秒再次运行。 / p>

我已经尝试了setTimeout和上面的Meteor.setTimeout并且它们的行为相同,一小时左右后你可以看到明显的内存泄漏。

值得一提的是,即使我禁用了我的代码并且被调用的函数刚刚返回,它仍然会泄漏。

服务器:OSX,Node 9.3,Meteor 1.6

发现很少有其他人在使用setTimeout但不同的情况下发生内存泄漏。

更新 问题是调度函数是在另一个我不知道的任务中被调用的,并且一个人有非常繁重的异步代码并且没有等待,因此它在完成之前被重新安排,并且在一段时间后它会加起来。谢谢你的所有答案。

2 个答案:

答案 0 :(得分:1)

如果你摆脱了t​​ry 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:也许你可以添加仍然泄漏的最小代码示例?