2

我的节点应用程序的 CPU 使用率正在逐渐增加。我发现内存泄漏正在发生。通过 AppDynamics,我发现在processImmediate调用树下有大量保留的内存随着时间的推移而不断增加。当我深入研究时,我发现问题出在setPromises函数上。

应用动态屏幕截图

我想听听你对我一直在使用的 Promise 的一种特殊用法的看法。循环的承诺。下面是这种用法的示例函数结构。

var dataArray = []; //list of jsons
var Promise = require('node-promise').Promise;

function doSomething(){
    try{
        var promises = [];
        //create function promises and push
        for(var i in dataArray){
            var usage = {};
            usage["user"] = dataArray[i].user;
            promises.push((function(ob){
                var log = extend({},ob);
                return executeFunction(log)}).bind(null,usage));
        }

        //loop and execute
        var respArray = [];
        return (promises.reduce(function(previous , current , index , array){
            try{
                return previous.then(function(resp){
                    if(resp != null)
                        respArray.push(resp);
                    if(promises.indexOf(current)==promises.length -1){
                        return current();
                    }
                    else{
                        return current();
                    }
                });
            }catch(ex){
                throw { ex : ex.stack};
            }
        },delay())).then(function(){
            return data;
        });
    }
    catch(ex){
        console.log(ex,ex.stack);
        throw { ex : ex.stack};
    }
}

function logTemplate(log){
    return models.Users.create(log).then(function(resp){
        return resp;
    },function(err){
        return err;
    });
}

一个小时内的堆增长如下图所示

在此处输入图像描述

上述函数必须对数据数组中的对象进行同步更新。这有内存泄漏的可能性吗?

4

1 回答 1

-1

不确定这是否会导致内存泄漏,但您的函数肯定有大量不必要的垃圾,可以用 BluebirdPromise.mapSeries()和其他 Bluebird 助手清理。

这样做很可能有助于减少内存泄漏。

doSomething功能减少到 8 行:

function doSomething(){
    return Promise.delay(1000)  // <-- specify time
        .return(dataArray)
        .mapSeries(function (el) {
            return executeFunction({ user: el.user });
        })
        .filter(function (result) { 
            return result !== null; 
        });
}
于 2017-11-15T06:46:45.670 回答