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

Kai*_*zay 57 javascript garbage-collection node.js

在启动时,似乎我的node.js应用程序使用大约200MB的内存.如果我暂时不管它,它会缩小到9MB左右.

是否可以从应用程序内:

  1. 检查应用程序使用的内存量?
  2. 请求垃圾收集器运行?

我问的原因是,我从磁盘加载了一些临时处理的文件.这可能会导致内存使用量激增.但是我不希望在GC运行之前加载更多文件,否则存在内存不足的风险.

有什么建议 ?

Ign*_*uus 91

如果使用该--expose-gc标志启动节点进程,则可以调用global.gc()强制节点来运行垃圾回收.请记住,节点应用程序中的所有其他执行都会暂停,直到GC完成,因此请不要经常使用它,否则会影响性能.

您可能希望在代码中进行GC调用时包含一个检查,以便在没有标志的情况下运行节点时不会出现问题:

try {
  if (global.gc) {global.gc();}
} catch (e) {
  console.log("`node --expose-gc index.js`");
  process.exit();
}
Run Code Online (Sandbox Code Playgroud)

  • catch 块什么时候运行?如果缺少 `--expose-gc` 则 `global.gc` 将是未定义的 (6认同)
  • @pea3nut 它是节点使用的 V8 运行时的一个选项。这个选项和其他选项可以用“node --v8-options”列出 (4认同)
  • 您必须将 true 传递给函数以进行完整 GC,否则它只会执行一次次要 GC (4认同)
  • “--expose-gc”的文档在哪里?我在 nodejs.org 中找不到任何文档。 (2认同)
  • FWIW,传递“true”(至少现在)会影响_minor_集合:https://github.com/nodejs/node/blob/5421e15bdc6122420d90ec462c3622b57d59c9d6/deps/v8/src/extensions/gc-extension.cc#L65- L71 (2认同)

Piq*_*qué 6

Node允许我们手动触发垃圾回收。这可以通过运行带有--expose-gc标志(即node --expose-gc index.js)的Node来完成。
在该模式下运行节点后,您可以随时通过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();
}
Run Code Online (Sandbox Code Playgroud)


TmT*_*ron 6

当您--expose-gc因任何原因无法在启动时将标志传递给节点进程时,您可以尝试以下操作:

import { setFlagsFromString } from 'v8';
import { runInNewContext } from 'vm';

setFlagsFromString('--expose_gc');
const gc = runInNewContext('gc'); // nocommit
gc();
Run Code Online (Sandbox Code Playgroud)

笔记:

此方法应谨慎使用。VM 启动后更改设置可能会导致不可预测的行为,包括崩溃和数据丢失;或者它可能什么也不做。