Version
v18.20.2
Platform
Microsoft Windows NT 10.0.22631.0 x64
Subsystem
No response
What steps will reproduce the bug?
The following script which continually creates and closes fs watches can reproduce the leak:
const os = require('os');
const fs = require('fs');
const path = require('path');
const DIR = path.join(os.tmpdir(), 'fs-watch-leak');
async function test() {
if (!fs.existsSync(DIR))
await fs.promises.mkdir(DIR);
for (let i=1; i<=1000; ++i)
await fs.promises.writeFile(
path.join(DIR, `file-${i}.txt`),
`${i} test file for watching`
);
const files = await fs.promises.readdir(DIR);
for (let loop = 0; ; ++loop) {
const watches = [];
for (const file of files)
watches.push(fs.watch(path.join(DIR, file)));
for (const watch of watches)
watch.close();
process.stdout.write(JSON.stringify({
loop,
files: files.length,
...process.memoryUsage()
}) + "\n");
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
test();
How often does it reproduce? Is there a required condition?
always
What is the expected behavior? Why is that the expected behavior?
Closing the fs watch should free all memory associated with it, including native memory.
What do you see instead?
We are seeing RSS continually rise while heap total and used remains consistent:

Additional information
I've tested this with multiple versions of node (16.20.2 and 20.6.0) and on another version of windows (server 2022), and the leak appears to be present on all.
I've also tested this script on linux and the leak does NOT appear to exist there.
Version
v18.20.2
Platform
Microsoft Windows NT 10.0.22631.0 x64
Subsystem
No response
What steps will reproduce the bug?
The following script which continually creates and closes fs watches can reproduce the leak:
How often does it reproduce? Is there a required condition?
always
What is the expected behavior? Why is that the expected behavior?
Closing the fs watch should free all memory associated with it, including native memory.
What do you see instead?
We are seeing RSS continually rise while heap total and used remains consistent:

Additional information
I've tested this with multiple versions of node (16.20.2 and 20.6.0) and on another version of windows (server 2022), and the leak appears to be present on all.
I've also tested this script on linux and the leak does NOT appear to exist there.