【发布时间】: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