我的 Nodetime 堆快照中有一些令人惊讶的结果:
我是否正确地阅读了我的堆中有 1706 个“用户”实例?这似乎高得离谱,我什至不太确定我会如何分配这么多。无论如何,是否有任何提示/技巧/提示可以找出这些问题的原因?我已经在我的代码中使用了 JSHint 来确保没有分配空闲的全局变量。一切都应该包含在请求的闭包范围内……那么为什么当请求完成时用户、帖子等不被垃圾收集呢?这是一些(编辑过的)代码来展示我是如何做事的......
非常令人惊讶的是,我在最后一次 API 调用完成后大约 10m 拍摄了上面的堆快照。所以,在触发它们被分配的请求完成后,这些对象都在附近徘徊了很长时间!
代码:
var User = require('./user').User,
Q = require('q');
// this function is called via express' router, eg when the client visits myapi.com/users/zane
function getUser(req, res, next)
{
var user = extend({},User).initialize();
Q.ncall(user.model.find, user.model, {'username': req.arguments[0]})
.then(function(data){
res.writeHead(200, {});
res.end(JSON.stringify(data));
})
.fail(next).end();
}
“用户”模块看起来像这样:
exports.User = extend({}, {
initialize: function() {
var Schema = api.mongoose.Schema;
this.schema = new Schema({
'username': {'type':String, 'index':true}
});
this.model = api.db.model('users', this.schema);
}
// ... some other helper functions in here
});
根据我上面的快速代码,我希望分配的用户对象的生命周期仅与请求返回的时间一样长。我在这里错过了一些关键的 Node.js GC 想法吗?