请求Node.js进程垃圾收集

2020-03-28大约6分钟

垃圾收集是JavaScript开发人员通常不必担心的那些深奥的主题之一。它只是在幕后发生,生活是美好的。通常,通过一些性能监控系统,我们可以看到内存占用率的上上下下:

图片

通常,我们不必要主动请求Node.js进行垃圾回收。但有的时候,我们的确需要观察一下我们的程序的内存占用情况,比如:

  • 通过查看监视工具中的内存减少,了解应用程序所承受的垃圾量

  • 查看发生垃圾收集时应用程序性能如何变化

  • 快速验证是否存在内存泄露的发生

如果您了解Java的话,会知道Java提供了System.gc()来让我们可以建议JVM来进行垃圾回收,虽然只是“建议”而已。Node.js里面是否有类似的用法呢?

答案是肯定的。不过,默认情况下,这个功能并未开启。

您可以使用以下的任何一种用法来建议GC来进行垃圾回收:

gc();
global.gc();

上面两种写法都是可以的,但是默认情况下,您会遇到“ReferenceError: gc is not defined”或“TypeError: global.gc is not a function”这样的错,怎么办?

Node.js支持一个命令行选项--expose-gc,该选项将向该global对象添加gc()函数,比如您可以这样执行您的代码:

node --expose-gc my_program.js

就可以了。

gc()函数所做的,只是建议垃圾回收系统进行垃圾清理,但不能保证垃圾回收。垃圾回收是个比较费时的操作,因此GC更倾向于当内存不够用或者CPU占用不高的时候才去执行。