阻止 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
取消的句柄。
我最近在 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
取消的句柄。