1

我正在使用 nodetime 来分析我的节点应用程序。显然,存在内存泄漏;这是我在 2 天内的堆(2 次下降是由于重新启动应用程序):

在此处输入图像描述

所以我正在拍摄堆快照,但很难弄清楚泄漏的原因是什么。对象似乎来来去去(例如,堆中的对象并不总是相同的)。这是一个例子:

在此处输入图像描述

我不太确定从这里去哪里。在这种特殊情况下,我识别出“最大实例”中表示的字符串。第二个和第三个字符串都来自我使用Node-OAuth加载Facebook Graph的 /me/home 端点。

说实话,我实际上并不清楚“body”属性是否真的在泄漏,或者它是否只是在我拍摄快照时巧合在堆中(如果我拍摄另一个快照,它并不总是存在)。

无论如何,这是我的 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});
    });
};

所以,我留下的印象是“body”字段以某种方式被保留/泄露。不过,我发现堆快照专门引用了 body 属性,而不是“响应”属性,这很奇怪。

任何人都可以为我提供一些关于如何找出泄漏的最终原因的可靠方向吗?

4

0 回答 0