内存泄漏和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来使用内置的EventEmitter
( http://nodejs.org/api/events.html )。
V8 GC是否收集没有使用的variables,但是在它们下面有一个函数闭包?
如果使用前一个函数作用域中的variables,那么variables将不得不坚持到包含函数作用域和所有包含该variables的callback函数超出作用域。
但是可变通道是否会被GC删除(它没有被任何函数使用)?
根据你发布的代码示例,是的,它将被GC收集。 但是很可能泄漏了一两个参考文献而没有注意到。