为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复此内存泄漏监视器功能以避免最大调用堆栈循环?

如何修复此内存泄漏监视器功能以避免最大调用堆栈循环?

牛魔王的故事 2022-07-21 10:29:50
我在追踪 Node.js 中的内存泄漏时遇到了麻烦,并编写了一个函数来监视对象和数组大小随着时间的推移而增加,但我的函数无限循环。我在其中写了一条规定来检测而不是迭代循环结构,但我犯了一些愚蠢的错误,无法弄清楚是什么。//monitor.jsconst 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.jsmodule.exports = (obj) => {  try {      JSON.stringify(obj);  } catch (e) {      return true;  }  return false;}这次我犯了什么愚蠢的错误?这似乎是简单的代码,而我不明白为什么它是无限循环的事实令人尴尬,哈哈。
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

您的 foreach 循环使用原始 obj 而不是道具调用 countObjContents 。

您还在第一次条件检查中重新调用 countObjContents。

  countObjContents(obj, count = 0) {
      if (Array.isArray(obj)) count += this.countObjContents(obj)

仅这一部分就是一个无限循环


查看完整回答
反对 回复 2022-07-21
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信