5

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

4

1 に答える 1

2

この行は、疑わしいほど効率が悪いように見えます。

var user = extend({},User).initialize();

extend呼び出しがオブジェクトをコピーしてUserから、そのinitializeメソッドを呼び出すと想定しています。UserAPI 呼び出しごとにオブジェクトをコピーするのはなぜですか?

次に、initialize呼び出しで新しい Mongoose スキーマ オブジェクトを作成し、呼び出しを介してモデルとして登録しapi.db.modelます。一度スキーマを作成し、初期化時に登録したほうがよいのではないでしょうか?

これらの両方が組み合わさると、呼び出しごとに必要以上のオブジェクトが作成される可能性があり、これらの登録された Mongoose モデルは簡単に GC できないに違いありません。

于 2012-10-14T23:56:13.387 に答える