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


77

在启动时,看来我的node.js应用程序使用了大约200MB的内存。如果我搁置一段时间,它会缩小到9MB左右。

是否可以从应用程序内执行以下操作:

  1. 检查应用程序正在使用多少内存?
  2. 请求垃圾收集器运行?

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

有什么建议 ?


您如何加载这些文件?如果需要加载巨大的文件,则必须使用Stream方法,并且可以在读取文件的同时对其进行处理。你考虑了吗?
以及

@well那是3年前。我现在正在从事其他项目,对此记不清了。
拉胡尔·艾耶

Answers:


120

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

在从代码内进行GC调用时,您可能需要包括一个检查,这样如果在没有标志的情况下运行node,事情不会变坏:

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

1
“ --expose-gc”的文档在哪里?我在nodejs.org中找不到任何文档。
pea3nut19年

2
@ pea3nut是节点使用的V8运行时的一个选项。此选项和其他选项可以与node --v8-options
janispritzkau

3
您必须完全使用完整GC的函数,否则它将执行次要GC
Piyush Balapure 19-10-20

@PiyushBalapure,您有关于gc()参数的参考吗?
弗兰克·弗赖堡

我还没有看到gc()参数的文档。甚至在V8文档中都找不到。我读到完整的GC这里nodesource.com/blog/...
的Piyush Balapure

8

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();
}

-6

我建议的一件事是,除非您在启动时就需要这些文件,否则请尝试仅在需要它们时才加载它们。

编辑:请参阅上面的帖子。


我在启动时需要文件。实际上,一旦GC运行,我的应用程序在其生存期内将仅使用9MB内存。我要做的只是需要一个JSON对象(即字典)。由于此代码位于node.js内部,因此无法对其进行优化。但我需要字典可用于搜索建议。
Rahul Iyer 2014年

我有点困惑。almost no memory如果您需要此对象作为搜索建议,它如何从9MB减小到9MB?我认为那些仍然应该是终身为您的应用程序..
lwang135

几乎没有记忆力是什么意思?是的,我“要求” json文件执行类似var foo = require('./ mydictionary')的操作,并且在我的应用程序的生命周期中一直存在。启动时,我的node.js应用程序的内存使用量高达200MB!(我不明白为什么您说几乎没有内存),然后过了一段时间,内存降到了9MB,即使字典仍在内存中。
Rahul Iyer 2014年

抱歉,我说“几乎没有内存”,因为您说:“但是我不希望在GC运行之前再加载更多文件,否则存在内存不足的风险。” 也许正确的做法是寻找使您的应用程序达到200MB的原因。如果字典在内存中,那不应该是它的原因。
lwang135

它只是一个require语句require('./ foo')。带有字符串列表的JSON对象。我的服务器只有1GB的内存,所以我只是为了安全起见。
Rahul Iyer 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.