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

标签 javascript node.js

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

相关文章:

node.js - NPM:npm 安装在 fetchMetaData -> addTmpTa 上挂起

javascript - 使用 Gulp、Babel 和 config.yml 发出异步完成信号

javascript - 将 fp-ts TaskEither 与右侧的 Either 链接起来

javascript - 如何在不影响输入文本颜色的情况下修改占位符颜色

javascript - 获取所需图片的jQuery代码

javascript - 如何在 javascript 中向多边形添加图案?

javascript - 如何在nodejs中实现web服务跨域访问?

javascript - 用户通过身份验证后如何获取 instagram id (instagram-node)

javascript - 无法在 emberjs 的 View 中建模

javascript - Node.js npm install express 无法从注册表中获取