内存泄漏和NodeJS中的closures问题

当我们开始testing我们的NodeJS项目时,我们注意到了巨大的内存消耗。 这是由我们的项目内存泄漏造成的。 所以我们开始寻找所有可能产生内存泄漏的原因。 在stackoverflow上有这个问题的一些答案,但没有什么是和什么是内存泄漏任何straitforward文件。

我的问题:

  • V8 GC上是否有文档以及它是如何工作的(详细信息)?
  • 如何释放callback,以便GC可以收集它们?
  • V8 GC是否收集了没有使用的variables,但是在它们下面有一个函数闭包? 例:

    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删除(它没有被任何函数使用)?

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

V8 GC是否收集没有使用的variables,但是在它们下面有一个函数闭包?

如果使用前一个函数作用域中的variables,那么variables将不得不坚持到包含函数作用域和所有包含该variables的callback函数超出作用域。

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

根据你发布的代码示例,是的,它将被GC收集。 但是很可能泄漏了一两个参考文献而没有注意到。