当我们开始测试我们的NodeJS项目时,我们注意到了巨大的内存消耗。它是由我们项目中的内存泄漏引起的。所以我们开始寻找可能导致内存泄漏的所有原因。 stackoverflow上有一些关于这个问题的答案,但是没有任何关于什么是内存泄漏和什么不是内存泄漏的简明文档。
我的问题:
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会删除变量通道(任何函数都不使用它)?
答案 0 :(得分:0)
首先我要说你应该移动你的API以使用内置的EventEmitter
(http://nodejs.org/api/events.html)。
V8 GC是否收集了未使用但下面有功能闭包的变量?
如果使用前一个函数作用域中的变量,那么变量必须保持不变,直到包含函数作用域和包含该变量的所有回调都超出范围。
但GC会删除变量通道(任何功能都不使用它)?
根据您发布的代码示例,是的,它将由GC收集。但是很有可能在没有注意的情况下泄露了一两个参考文献。