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

bxs*_*shi 11 closures memory-leaks node.js

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

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
});
Run Code Online (Sandbox Code Playgroud)

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

var a = 0;
var b = 1;
var c = 0;
example_func(c, func(){
    console.log(b);
    a = null;
    b = null;
    c = null;
});
Run Code Online (Sandbox Code Playgroud)

但我仍然有泄密,所以我试着memwatch-node找出我的代码有什么问题.

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

我有这样的JSON

 { what: 'Closure',
   '+': 12521,
   size: '520.52 kb',
   '-': 5118,
   size_bytes: 533016 },
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以获得关于哪个封口泄漏的更具体的细节.

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

Edm*_*der 2

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

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

如果您传递函数并保留对该函数的引用,则它的闭包可以引用其他闭包。因此,您可能有一个包含很多内容的闭包。

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