[英]How to request the Garbage Collector in node.js to run?
在启动时,我的 node.js 应用程序似乎使用了 memory 的大约 200MB。如果我暂时搁置它,它会缩小到大约 9MB。
是否可以从应用程序内:
我问的原因是,我从磁盘加载了一些临时处理的文件。 这可能会导致 memory 使用量激增。 但是我不想在 GC 运行之前加载更多文件,否则有我会用完 memory 的风险。
有什么建议么?
如果您使用--expose-gc
标志启动节点进程,则可以调用global.gc()
以强制节点运行垃圾收集。 请记住,节点应用程序中的所有其他执行都会暂停,直到 GC 完成,所以不要经常使用它,否则会影响性能。
在从代码中进行 GC 调用时,您可能希望包含一个检查,这样如果节点在没有标志的情况下运行,事情就不会变坏:
try {
if (global.gc) {global.gc();}
} catch (e) {
console.log("`node --expose-gc index.js`");
process.exit();
}
Node允许我们手动触发垃圾收集。 这可以通过使用--expose-gc
标志运行Node来实现(即node --expose-gc index.js
)。
一旦节点以该模式运行,您可以通过从程序中调用global.gc()
来以编程方式触发垃圾收集。
前 -
// Force garbage collection every time this function is called
try {
if (global.gc) {global.gc();}
} catch (e) {
console.log("`node --expose-gc index.js`");
process.exit();
}
当您出于任何原因无法在启动时将--expose-gc
标志传递给您的节点进程时,您可以尝试以下操作:
import { setFlagsFromString } from 'v8';
import { runInNewContext } from 'vm';
setFlagsFromString('--expose_gc');
const gc = runInNewContext('gc'); // nocommit
gc();
笔记:
此方法应谨慎使用。 在 VM 启动后更改设置可能会导致不可预测的行为,包括崩溃和数据丢失; 或者它可能什么都不做。
我建议的一件事是,除非您在启动时需要这些文件,否则请尝试仅在需要时加载它们。
编辑:请参阅上面的帖子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.