使用.map创建数组时Node.js内存泄漏



我正在使用node向网站重复请求,并试图调试由此产生的内存泄漏。通过使用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的Comparison日志和Chrome DevTools的日志来看,node.js似乎正在保存以下对象:

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

每次程序运行时,并且在运行后不删除旧程序,这很快就会导致内存溢出。为了避免这个问题,我在.map((中本地创建了变量,但我不确定自己做错了什么。你知道为什么会发生这种事吗?

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

bufferData = Buffer.concat(bufferData);

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

response.on('end', function () {
... rest of the code ...
resolve(bufferDataMapped2);
bufferData = null;
}); 

但是,为了得到更好的响应,我希望看到代码的其余部分。

最新更新