javascript – Node.js(v8)垃圾收集器如何工作?

我做了一些测试,我的node.js应用程序寻找我的代码应该做的内存泄漏。我运行脚本,在我看来应该泄漏记忆,但我对结果感到惊讶。

redisClient.on('message', initRequest);


function onSuccess(self, json){

  console.dir(json);

}


function initRequest(channel, message){

  var request = new RequestObject({

    redisMessage: message

  });

  request.on('success', onSuccess);

}

redisClient每秒发送一些“消息”事件。这意味着initRequest函数经常被调用。每次请求对象在内存中创建,并且onSuccess函数绑定到其“success”事件。

我假设(但在这里我可能是错误的),只要有监听器(在这种情况下是onSuccess)绑定到这个对象,它不能被垃圾回收。然后我想,内存使用将会增长,因为内存不会被释放。

作为这个潜在泄漏的解决方案,我想使用.once而不是.on,因为这将取消绑定侦听器,对象可能被垃圾回收。

我已经使用pmap来测试这两种情况(比较.on和.once和另一种在这里不值一提的场景),我没有发现很大的区别。

总结一下我有两个问题:

>这种正常的GC行为是在某些间隔内清洁记忆体,还是在达到某些特征之后才能进行清洁?
>我正确地假设.on应该泄漏内存的示例代码,我没有看到内存消耗图表?

1:是的:-)

2:一般来说,当使用事件侦听器时,内存泄漏是指正在侦听的对象被阻止被垃圾回收,因为正在发出的对象正在保留对它的引用。

所以在你的代码中,onSuccess函数将被你的请求对象引用。但是,onSuccess只是一个被重用为所有请求对象的侦听器的函数,因此不应该导致内存累积。

Sidenote:我不知道redisClient和RequestObject的内部,但是对于我来说,它也看起来像在initRequest函数完成之后,可能在调用任何监听器之前,请求将准备好进行垃圾收集。

http://stackoverflow.com/questions/21162969/how-does-the-node-js-v8-garbage-collector-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – Node.js(v8)垃圾收集器如何工作?