11

我的 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 },

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

我已经为所有闭包分配了名称,但仍然无法正常工作。

4

1 回答 1

2

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

另外,我相信您对什么是闭包感到困惑。MDN 关于闭包的页面给出了很好的描述。闭包不是一个变量,而是一个作用域,它使函数能够保留引用并在这些变量引用原本不可用的代码部分中使用时继续工作。

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

这样做:禁用部分代码,直到 memwatch 停止抱怨。然后,查看该代码。如果您仍然感到困惑,请在此问题中发布更多详细信息。

于 2013-06-30T00:41:26.853 回答