这是人们在开始使用PM2时能够清楚地看到内存使用情况的常见问题。 Node.js使用Google的V8 JavaScript引擎,它实现了垃圾收集器。 V8使用的GC算法将尝试占用尽可能多的内存,并且在清理未使用的内存时非常懒惰。因此,通常情况下,节点进程将继续增加内存使用量,直到GC认为更好地释放内存的某个点。请注意,节点进程的硬内存限制为1.4 GB。
有一种方法可以强制GC释放内存,使用 --expose-gc 旗。像这样运行你的服务器:
--expose-gc
node --expose-gc yourscript.js
并在应用程序的某处附加以下循环。这将每30秒强制进行垃圾收集。
setInterval(function(){ global.gc(); console.log('GC done') }, 1000*30);
如果你正在使用PM2,你需要做额外的工作才能通过 --expose-gc 请注意,在实践中,您可能应该避免进行手动垃圾收集,并让V8完成其工作。
其次,尽管显然没有做任何事情,你的过程首先增加的原因可能是PM2本身。默认情况下,PM2以群集模式运行,而不是fork模式。群集模式将在后台运行某些进程,从而随着时间的推移增加内存。这个内存最终会在某些时候由GC解除分配。如果在fork模式下运行PM2,则当进程空闲时,内存占用应保持在同一级别。