首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js (v8)垃圾收集器是如何工作的?

Node.js (v8)垃圾收集器是如何工作的?
EN

Stack Overflow用户
提问于 2014-01-16 21:20:23
回答 2查看 5.7K关注 0票数 17

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

代码语言:javascript
复制
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函数经常被调用。每次在内存中创建request对象时,都会将函数onSuccess绑定到它的“成功”事件。

我假设(但这里我可能错了),只要listener (本例中为onSuccess)绑定到这个对象,它就不能被垃圾收集。然后我想,内存使用量将会增长,因为内存不会被释放。

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

我已经使用pmap测试了这两个场景(比较.on.once以及另一个场景,这里不值得一提),我没有发现很大的区别。

总结一下,我有两个问题:

  1. 是一种正常的GC行为,用于在某个时间间隔或达到某个阈值后清除内存,而不是持续清除?

  1. 我是否正确地假设.on的示例代码应该泄漏内存,这在内存消耗图上看不到?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-25 22:55:39

1:是:-)

2:一般来说,使用事件侦听器时的内存泄漏是因为正在发出的对象保留了对它的引用,所以不会对正在侦听的对象进行垃圾回收。

因此,在您的代码中,request对象将引用onSuccess函数。但是,onSuccess只是一个被重用为所有请求对象侦听器的函数,这样就不会导致内存积累。

旁注:我不知道redisClientRequestObject的内部结构,但在我看来,一旦initRequest函数完成,也就是在调用任何侦听器之前,request就会准备好进行垃圾回收。

票数 5
EN

Stack Overflow用户

发布于 2014-02-25 23:03:12

据我所知,request对象应该只存在于initRequest函数中,因此应该在函数终止时标记为垃圾回收。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21162969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档