5

当我们开始测试我们的 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 删除(它不被任何函数使用)?

4

1 回答 1

0

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

V8 GC 是否收集未使用但在其下方有函数闭包的变量?

如果您使用前一个函数作用域中的变量,那么该变量将不得不一直存在,直到包含函数作用域以及包含该变量的所有回调都超出作用域为止。

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

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

于 2013-07-01T06:36:05.580 回答