【问题标题】:Node.js memory leak when using .map to create an array使用 .map 创建数组时 Node.js 内存泄漏
【发布时间】:2020-03-12 05:48:33
【问题描述】:

我正在使用节点向网站发出重复请求,并尝试调试导致的内存泄漏。通过使用node --inspect server.js,我已经能够猜到这是导致问题的代码(这是 Promise 的一部分,因此最后是“resolve()”):

response.on('end', function () {
    //store response in variable
    bufferData = Buffer.concat(bufferData);
    try {
        var bufferDataDecoded  = thisProtocol.FeedMessage.decode(bufferData).entity;
    } catch (e) {
        console.log("Protocol Error:  "+e);
        resolve([0]);
    }
    var timeNow = new Date();
    var bufferDataMapped= bufferDataDecoded
    .map(obj=> {
        return obj.item_update
            .map(itemu=>{
            if ((itemu.quantityOld-itemu.quantityNew) > 0 ){
                return {
                "resultType": bufferType
                ,"itemID": itemu.itemID
                ,"quantityOld": itemu.quantityOld
                ,"quantityDiff": itemu.quantityNew - itemu.quantityOld
                };
            }
            else return false;
        })
    });
    var bufferDataMapped2= [].concat.apply([],bufferDataMapped);
    resolve(bufferDataMapped2);
}); 

通过查看来自 --inspect 的比较日志并使用 Chrome DevTools 查看,看起来 node.js 正在保存这些对象,例如:

 {
   "resultType": bufferType
   ,"itemID": itemu.itemID
   ,"quantityOld": itemu.quantityOld
   ,"quantityDiff": itemu.quantityNew - itemu.quantityNew
 };

...每次程序运行时,并在运行后不删除旧的,这很快就会导致内存溢出。我在 .map() 中本地创建了变量,试图避免这个问题,但我不确定我做错了什么。任何想法为什么会发生这种情况?

【问题讨论】:

  • itemu.quantityNew - itemu.quantityNew?不是一直都是0吗?不应该是itemu.quantityNew - itemu.quantityOld吗?
  • 我怀疑问题出在更大范围内如何使用它。当 promise 被解决时,有些东西正在保存对数组的引用。
  • catch 中还有一个 bug,在 resolve([0]) 之后缺少一个 return
  • 要调试内存泄漏,制作堆快照并检查引用了应该被垃圾回收的对象的内容。

标签: javascript node.js memory-leaks


【解决方案1】:

我缺少一些代码,所以,这是我的结论。看看这段代码:

bufferData = Buffer.concat(bufferData);

bufferData 是一个全局变量,因此在每次执行中都会连接先前的执行数据。尝试在每次执行结束时分配 null:

response.on('end', function () {
    ... rest of the code ...

    resolve(bufferDataMapped2);
    bufferData = null;
}); 

但是,为了得到更好的响应,我想看看其余的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-01-01
    • 2013-11-02
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多