用memwatch-node识别闭包的内存泄漏

时间:2012-12-10 09:51:31

标签: node.js memory-leaks closures

我的Node.js项目遭遇内存泄漏,我已经在闭包中将变量设置为null,我的意思是,我知道这样的代码:

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
});

会导致内存泄漏,所以我添加了一些代码来将这些变量设置为null;

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
    a = null;
    b = null;
    c = null;
});

但我仍然有泄漏,所以我尝试使用memwatch-node来弄清楚我的代码有什么问题。

结果显示导致泄漏的closure,但未指定足够的目标。

我有像这样的JSON

 { what: 'Closure',
   '+': 12521,
   size: '520.52 kb',
   '-': 5118,
   size_bytes: 533016 },

我想知道我是否可以获得有关哪个关闭泄漏的更具体细节。

我为所有关闭分配了名称,但仍无效。

1 个答案:

答案 0 :(得分:2)

您无法更详细地了解哪个闭包。 memwatch获取v8堆的转储然后获取它的差异并报告泄漏,如果在连续5次垃圾收集事件之后,该对象类型计数继续增长。

另外,我相信你对什么是封闭感到困惑。 The MDN page on closures给出了很好的描述。闭包不是一个变量,而是一个范围,它允许函数保留引用,并在代码的一部分中使用时继续工作,否则这些变量引用将无法使用。

如果你传递函数保持对该函数的引用,它的闭包可以引用其他闭包。所以,你可能有一个可以有很多的闭包。

执行此操作:禁用部分代码,直到memwatch停止投诉为止。然后,看看那段代码。如果您仍然感到困惑,请在此问题中发布更多详细信息。