2016-01-15 20 views
2

我已经用服务器上的一个文件(server.js)创建了一个新项目,这段代码不会执行任何操作。但是,在运行它之后,我的节点进程正在使用大约1Gb的内存。有谁知道为什么?Meteor.setTimeout()内存泄漏?

for (var i = 1000000; i >= 0; i--) { 
    Meteor.setTimeout(function(){},1000); 
}; 

显然Meteor.setTimeout()函数或使用的东西(封?)防止GC从已经执行后清除内存。有任何想法吗?

回答

1

既然你在服务器端调用它,Meteor.setTimeout比表面上看起来要复杂得多。 Meteor.setTimeout使用Meteor.bindEnvironment()封装了setTimeout,它基本上将当前环境的上下文绑定到超时回调。当这个超时触发时,它会在最初被调用的时候进入。

一个很好的例子是如果你在服务器上调用Meteor.method()并在其中使用Meteor.setTimeout()。 Meteor.method()将跟踪调用该方法的用户。如果使用Meteor.setTimeout(),它会将该环境绑定到超时的回调,从而增加空函数()所需的内存量。

至于为什么你的服务器上没有任何垃圾收集,它可能没有打到它的缓冲区。我试着运行你的测试,我的虚拟内存大约在1.2GB左右,但即使在后续测试之后,它也没有更高。尝试多次运行该代码以查看内存消耗是否继续呈线性增长,或者是否达到上限并停止增长。