我在服务器上创建了一个只有一个文件(server.js)的新项目,只需要一小段代码就可以完成任务。但是,在运行它之后,我的节点进程正在使用大约1Gb的内存。有谁知道为什么?
for (var i = 1000000; i >= 0; i--) {
Meteor.setTimeout(function(){},1000);
};
显然Meteor.setTimeout()函数执行或使用某些东西(闭包?),以防止GC在执行后清除内存。有什么想法吗?
答案 0 :(得分:1)
由于您在服务器端调用它,因此Meteor.setTimeout比表面上显示的要复杂得多。 Meteor.setTimeout使用Meteor.bindEnvironment()包装setTimeout,它实际上将当前环境的上下文绑定到超时回调。当超时触发时,它将引入最初调用它的上下文。
一个很好的例子就是你在服务器上调用了Meteor.method()并在其中使用了Meteor.setTimeout()。 Meteor.method()将跟踪调用该方法的用户。如果你使用Meteor.setTimeout(),它会将该环境绑定到超时的回调,增加空函数所需的内存量()。
至于为什么服务器上没有任何垃圾收集,它可能没有点击它的缓冲区。我尝试运行你的测试,我的虚拟内存大约达到1.2gb,但即使在后续测试之后它也没有更高。尝试多次运行该代码,以查看内存消耗是否继续线性增加,或者是否达到上限并停止增长。