1

nodetime を使用してノードアプリを分析しています。明らかに、メモリ リークがあります。これが2日間の私のヒープです(2つのドロップオフはアプリの再起動によるものです):

ここに画像の説明を入力

だから私はヒープのスナップショットを撮っていますが、リークの原因が何であるかを理解するのに本当に苦労しています. オブジェクトは行き来するように見えます (たとえば、ヒープ内のオブジェクトが常に同じであるとは限りません)。次に例を示します。

ここに画像の説明を入力

ここからどこへ行くべきかよくわかりません。この特定のケースでは、「最大のインスタンス」で表される文字列を認識しています。2 番目と 3 番目の文字列はどちらも、 Node-OAuthを使用してFacebook グラフの /me/home エンドポイントを読み込んでいます。

正直なところ、「ボディ」プロパティが実際にリークしているのか、それともスナップショットを撮ったときに偶然にヒープにあったのかははっきりしていません (別のスナップショットを撮った場合、常に存在するとは限りません)。

いずれにせよ、これは私の OAuthNetwork クラスからの抜粋です。

OAuthNetwork.prototype.oauth = function() {
    return new OAuth(
            this.settings['url_request_token'],
            this.settings['url_access_token'],
            this.data['key'],
            this.data['secret'],
            this.settings['version'],
            this.settings['url_callback'],
            this.settings['encoding'],
            null,//nonceSize
            this.settings['request_headers']
        );
};
OAuthNetwork.prototype.requestWithCredentials = function(credentials, endpoint, method, params, callback)
{
    var url = this.getRequestURL(endpoint, method, params),
        m = (method || 'GET').toUpperCase(),
        body = (m==='PUT'||m==='POST') ? this.buildRequestBody(params) : '',
        ct = this.settings.request_headers['Content-Type'] || null,
        extra = null;

    this.oauth()._performSecureRequest(credentials.key, credentials.secret, method, url, extra, body, ct, function(error, data, response) {

        if(error)
        {
            callback(new Errors.External({'message':'there was an error with the remote service: '+JSON.stringify(error),'error':error,'endpoint': endpoint}));
            return;
        }
        callback(null, {'body': data, 'response': response});
    });
};

そのため、「ボディ」フィールドが何らかの形で保持/リークされているという印象が残っています。ただし、ヒープ スナップショットが "response" プロパティではなく body プロパティを明確に参照していることは奇妙です。

リークの最終的な原因を突き止める方法について、誰かが確実な方向性を教えてくれますか?

4

0 に答える 0