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

Luk*_*cki 5 closures memory-leaks node.js

当我们开始测试我们的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");
        })
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

Tre*_*ris 0

首先,我想说你应该移动你的 API 以使用内置的EventEmitter( http://nodejs.org/api/events.html )。

V8 GC 是否会收集未使用的变量,但它们下面有一个函数闭包?

如果您使用先前函数作用域中的变量,则该变量将必须保留下来,直到包含该变量的函数作用域以及包含该变量的所有回调都超出了作用域。

但是变量通道会被GC删除吗(它没有被任何函数使用)?

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