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

我在追踪 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;

}

这次我犯了什么愚蠢的错误?这似乎是简单的代码,而我不明白为什么它是无限循环的事实令人尴尬,哈哈。


牛魔王的故事
浏览 74回答 1
1回答

长风秋雁

您的 foreach 循环使用原始 obj 而不是道具调用 countObjContents 。您还在第一次条件检查中重新调用 countObjContents。  countObjContents(obj, count = 0) {       if (Array.isArray(obj)) count += this.countObjContents(obj)仅这一部分就是一个无限循环
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript