Node.js:如何从内存中释放Mongoose模型? (内存泄漏)

时间:2015-04-14 10:04:13

标签: node.js memory-leaks mongoose garbage-collection

如何在访问后从内存中释放模型?我使用带有global.gc()选项的--expose-gc来查看这是在占用我的记忆。

以下代码创建了10000个集合:

// mongoose connection
var db = mongoose.createConnection(...);

// amount of collections
var amount = 10000;

// create collections (100/per second)
var sync = async.queue(function(n, cb) {
    var schema = new mongoose.Schema({
        data: mongoose.Schema.Types.Mixed
    });
    var collection = 'model_'+n;
    var model = db.model(collection, schema);
    setTimeout(function() { cb(); }, 10);
}, 1);

// push to queue
for(var i=0; i<amount; i++) {
    sync.push(i);
}

// done
sync.drain = function(err) {
    console.log('all '+amount+' models done');
};

// garbage collector (every second)
setInterval(function() {
    try { global.gc(); } catch(gcerr) { }
}, 1000);

在创建集合并且永远不会释放内存时,内存使用量会增加:

1 - Memory used: 30 MB
2 - Memory used: 36 MB
3 - Memory used: 42 MB
4 - Memory used: 48 MB
5 - Memory used: 54 MB
6 - Memory used: 61 MB
7 - Memory used: 65 MB
8 - Memory used: 71 MB
9 - Memory used: 77 MB
10 - Memory used: 82 MB
all 10000 models done
11 - Memory used: 86 MB
12 - Memory used: 86 MB

如何在不关闭连接的情况下手动从内存中清除模型的任何想法?

找到解决方案

delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];

2 个答案:

答案 0 :(得分:2)

Mongoose通过mongoose或连接的属性公开模型和模式缓存(取决于你用来声明模型):

[mongoose or connection ].models //一个对象

[mongoose or connection ].modelSchemas //一个对象

每个都是一个使用声明的模型名称作为属性名称的对象。如果您想手动垃圾收集它们,则可以delete每个模型。

答案 1 :(得分:0)

这些线路完成了伎俩,让我记忆犹新:

delete db.models[collection];
delete db.collections[collection];
delete db.base.modelSchemas[collection];