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 のアイデアが欠けていますか?