Reputation: 21015
At startup, it seems my node.js app uses around 200MB of memory. If I leave it alone for a while, it shrinks to around 9MB.
Is it possible from within the app to:
The reason I ask is, I load a number of files from disk, which are processed temporarily. This probably causes the memory usage to spike. But I don't want to load more files until the GC runs, otherwise there is the risk that I will run out of memory.
Any suggestions ?
Upvotes: 121
Views: 121033
Reputation: 2248
If you launch the node process with the --expose-gc
flag, you can then call global.gc()
to force node to run garbage collection. Keep in mind that all other execution within your node app is paused until GC completes, so don't use it too often or it will affect performance.
You might want to include a check when making GC calls from within your code so things don't go bad if node was run without the flag:
if (global.gc) {
global.gc();
} else {
console.log('Garbage collection unavailable. Pass --expose-gc '
+ 'when launching node to enable forced garbage collection.');
}
Upvotes: 203
Reputation: 19381
When you cannot pass the --expose-gc
flag to your node process on start for any reason, you may try this:
import { setFlagsFromString } from 'v8';
import { runInNewContext } from 'vm';
setFlagsFromString('--expose_gc');
const gc = runInNewContext('gc'); // nocommit
gc();
Notes:
This method should be used with care. Changing settings after the VM has started may result in unpredictable behavior, including crashes and data loss; or it may simply do nothing.
Upvotes: 15