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 プロパティを明確に参照していることは奇妙です。
リークの最終的な原因を突き止める方法について、誰かが確実な方向性を教えてくれますか?