NodeJS中的内存泄漏和关闭问题

时间:2013-05-09 08:14:42

标签: node.js memory-leaks closures

当我们开始测试我们的NodeJS项目时,我们注意到了巨大的内存消耗。它是由我们项目中的内存泄漏引起的。所以我们开始寻找可能导致内存泄漏的所有原因。 stackoverflow上有一些关于这个问题的答案,但是没有任何关于什么是内存泄漏和什么不是内存泄漏的简明文档。

我的问题:

  • 是否有关于V8 GC的文档及其工作原理(详见)?
  • 如何释放回调以便GC可以收集它们?
  • V8 GC是否收集了未使用的变量,但它们下面是否有函数闭包?例如:

    var serviceChannel = require('./channel');
    var dataRegistration = require('../data/registration');
    
    function registerOnChannel(userID, channelID, callsuccess, callerror) {
    
        serviceChannel.findChannel(channelID, function (channel) {
            if (!channel) {
                callerror("Channel doesn' exists");
                return;
            }
            dataRegistration.registerOnChannel(userID, channelID, function (registration) {
                if (!registration) {
                    callerror("Registration doesn' exists");
                    return;
                }
                callsuccess("Registration successful");
            }, function (error) {
                callerror("Error on registration");
            })
        }, function (error) {
            callerror("Error on finding channel");
        })
    }
    

因此,只要registerOnChanel处于活动状态,serviceChannel和dataRegistration就会保留在内存中。但GC会删除变量通道(任何函数都不使用它)?

1 个答案:

答案 0 :(得分:0)

首先我要说你应该移动你的API以使用内置的EventEmitterhttp://nodejs.org/api/events.html)。

  

V8 GC是否收集了未使用但下面有功能闭包的变量?

如果使用前一个函数作用域中的变量,那么变量必须保持不变,直到包含函数作用域和包含该变量的所有回调都超出范围。

  

但GC会删除变量通道(任何功能都不使用它)?

根据您发布的代码示例,是的,它将由GC收集。但是很有可能在没有注意的情况下泄露了一两个参考文献。