在节点中手动运行垃圾收集

我正在使用节点,正在考虑在节点中手动运行垃圾收集。 这有什么缺点吗? 我这样做的原因是它看起来像节点没有足够频繁地运行垃圾收集。 有谁知道V8在节点中做垃圾收集例程的频率如何?

谢谢!

我实际上有1GB实例在heroku上运行节点的问题。

在生产stream量上运行节点服务器时,内存会一直增长,直到超过内存限制,导致运行缓慢。

这可能是由于应用程序产生大量垃圾引起的,主要是为了提供JSON API响应。 但这不是内存泄漏,只是未收集的垃圾。

看来,节点没有优先为旧的对象空间做足够的垃圾收集为我的应用程序,所以内存将不断增长。

手动运行global.gc()(使用节点–expose_gc启用)会每次减less50MB的内存使用量,并暂停应用大约400ms。

我最终做的是按照随机时间表手动运行gc(这样,heroku实例就不会一次执行GC)。 这减less了内存使用,并停止了内存配额超过错误。

简化的版本会是这样的:

function scheduleGc() { if (!global.gc) { console.log('Garbage collection is not exposed'); return; } // schedule next gc within a random interval (eg 15-45 minutes) // tweak this based on your app's memory usage var nextMinutes = Math.random() * 30 + 15; setTimeout(function(){ global.gc(); console.log('Manual gc', process.memoryUsage()); scheduleGc(); }, nextMinutes * 60 * 1000); } // call this in the startup script of your app (once per process) scheduleGc(); 

你需要运行你的应用程序垃圾收集暴露:

 node --expose_gc app.js 

我知道这可能是一个迟缓的答复,以帮助OP,但我想我会协同我最近的经验与节点JS内存分配和垃圾收集。

我们目前正在一个运行在树莓派3上的节点JS服务器上运行。每隔一段时间它就会因为内存不足而崩溃。 我最初认为这是一个内存泄漏,并经过一个半的search我的代码,什么都没有提出,我认为这个问题可能已经加剧的事实,节点JS分配更多的内存比Rpi3可用其执行GC之前的过程。

我一直在用以下命令运行我的服务器的新实例:

'node server.js –max-executable-size = 96 –max-old-space-size = 128 –max-semi-space-size = 2'

这有效地限制了节点在本地机器上占用的空间总量,并强制垃圾收集更频繁地完成。 到目前为止,我们已经看到了内存的不断使用,它证实了我的代码最初没有泄漏,而是节点分配的内存超过了可能。

编辑:这个链接在这里更具体地概述了我正在处理的问题。

– nodejs减lessv8垃圾收集器的内存使用率 – https://github.com/nodejs/node/issues/2738

V8当他认为是垃圾收集时,运行垃圾收集。 这没有固定的延迟。 你可以阅读这篇文章来了解垃圾收集V8: https : //strongloop.com/strongblog/node-js-performance-garbage-collection/

无论如何,在项目中手动运行垃圾回收器是一个坏主意,因为它完全阻止了节点进程。 所以在垃圾收集过程中,你的程序不会处理任何请求。