繁体   English   中英

如何请求node.js中的垃圾收集器运行?

[英]How to request the Garbage Collector in node.js to run?

在启动时,我的 node.js 应用程序似乎使用了 memory 的大约 200MB。如果我暂时搁置它,它会缩小到大约 9MB。

是否可以从应用程序内:

  1. 查看应用程序使用了多少 memory?
  2. 请求垃圾收集器运行?

我问的原因是,我从磁盘加载了一些临时处理的文件。 这可能会导致 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM