我在追踪 Node.js 中的内存泄漏时遇到了麻烦,并编写了一个函数来监视对象和数组大小随时间的增加,但我的函数无限循环。我在其中编写了一个规定来检测而不是迭代循环结构,但我犯了一些愚蠢的错误,并且无法弄清楚是什么。
//monitor.js
const isCircular = require("../funcs/is-circular.js");
module.exports = class {
constructor() {
}
countObjContents(obj, count = 0) {
if (Array.isArray(obj)) count += this.countObjContents(obj)
else if (typeof obj == "object") {
if (isCircular(obj)) {
console.log("!!! is circular")
count++;
} else {
console.log("not circular")
Object.values(obj).forEach(prop => {
if (isCircular(prop)) {
console.log("!!! is circular")
count++;
} else {
console.log("not circular")
count += this.countObjContents(obj);
}
});
}
} else count++;
return count;
}
watch(obj, name) {
let count = false;
setInterval(() => {
console.log("monitoring", name)
let newCount = this.countObjContents(obj)
if (!count) count = newCount;
else {
console.log("object", name, "increased from", count, "properties to", newCount);
count = newCount;
}
}, 5000);
}
}
//is-circular.js
module.exports = (obj) => {
try {
JSON.stringify(obj);
} catch (e) {
return true;
}
return false;
}
这次我犯了什么愚蠢的错误?这看起来像是简单的代码,但事实上我不明白为什么它是无限循环,这很尴尬哈哈。
错误:
countObjContents(obj, count = 0) {
^
RangeError: Maximum call stack size exceeded
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:6:19)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
at module.exports.countObjContents (C:\Users\jonat\Documents\GitHub\emporos\js\classes\monitor.js:7:43)
最佳答案
您的 foreach 循环正在使用原始 obj 调用 countObjContents 而不是 Prop 。
您还在第一个条件检查中重新调用 countObjContents。
countObjContents(obj, count = 0) {
if (Array.isArray(obj)) count += this.countObjContents(obj)
仅此部分就是一个无限循环
关于javascript - 如何修复此内存泄漏监视器函数以避免最大调用堆栈循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61494609/