阻止 NodeJS 的 readdir 泄漏内存

Stop NodeJS' readdir from leaking memory

我最近在 NodeJS 中写了一个 Interval,它每隔 X 秒检查一个文件夹的内容。它是异步的,因此它 运行 在其余代码旁边更新索引和内容。
OS 是 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 read/writes,我是否必须在此处对 readdir 做类似的事情?
这是错误还是错误做法?

提前致谢!

BR 克里斯

为什么要返回一个永远不会解决的 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) 隐藏在闭包中。

这个 returns 可以用 cancelInterval 取消的句柄。