【问题标题】:Stop NodeJS' readdir from leaking memory阻止 NodeJS 的 readdir 泄漏内存
【发布时间】:2020-02-26 09:49:37
【问题描述】:

我最近在 NodeJS 中编写了一个 Interval,它每 X 秒检查一次文件夹的内容。它是异步的,因此它在其余代码旁边运行以更新索引和内容。
操作系统是 Debian 9,节点为 v10.15.2 和 npm 5.8.0。

  return await new Promise(resolve => {
    const interval = setInterval(() => {
      console.log("Checking for new files...")
      fs.readdir("folder", (err,files) => {
        if(files.length != cur_files.length){
          console.log("New files detected!")
          updateIndexes(files);
        }else{
          console.log("Folder is up-to-date!")
        }
      });
    },10000);
  });
} 

我注意到,在使用低间隔计时器进行测试时,它会缓慢而稳定地每隔几分钟将内存使用量提高约 0.1MB。我知道这并没有很大的间隔,但是如果我在不重新启动的情况下运行它,它会随着时间的推移而累加。

代码的另一部分已经使用 Stream 进行频繁的文件读/写,我是否必须在这里使用 readdir 做类似的事情?
这是一个错误还是只是不好的做法?

提前致谢!

BR克里斯

【问题讨论】:

    标签: node.js memory memory-leaks directory


    【解决方案1】:

    为什么你返回一个永远不会解决的 Promise?

    垃圾收集器会定期收集未引用的对象,但将代码放入未解析的 Promise 中可能会阻止 GC 收集它们,因为它认为在 Promise 解析时需要它们。

    试试这个:

    
    return (() => {
      let fileCount = 0 // hide variable because State Machine
      return setInterval(() => {
          console.log("Checking for new files...")
          fs.readdir("folder", (err,files) => {
            if(files.length != fileCount){
              console.log("New files detected!")
              fileCount = files.length;
              updateIndexes(files); 
            }else{
              console.log("Folder is up-to-date!")
            }
          });
        },10000)
      })()
    } 
    

    它是一个状态机,它把它的状态(fileCount)隐藏在一个闭包中。

    这会返回一个句柄,您可以使用 cancelInterval 取消。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2016-01-01
      • 2019-07-17
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多