Javascript / Node.js数组内存pipe理

我有一个使用数组作为队列的场景,而且我对这个场景有一个关于内存的问题。

首先,我在全局中创build一个数组对象,并创build一个生产者,将元素不间断地推送到数组中。

var arr = []; function runningProducer() { setInterval(itemProducer, 50); function itemProducer() { var item = generateItem(); arr.push(item); } function generateItem() { return { a: Math.random(), }; } } 

然后,我创build一个客户在1秒内清除数组

 function runningCustomer() { setInterval(clearQueue, 1000); function clearQueue() { var t = arr.concat(arr); arr = []; } } 

并且运行上述function一段时间,我发现内存一直在增长。

 setInterval(() => { var mem = process.memoryUsage(); console.log(mem); }, 2000); 

我认为数组应该释放空置后的内存,但不是。 请给我一些关于这个问题的build议,有没有什么办法在javascript中手动释放内存?

这个问题的答案在Barmar的评论中。 保留的内存在不再需要的时候不会立即释放。 JavaScript依靠垃圾收集来检测未使用的引用,并将它们释放回堆中,但是垃圾收集是一个昂贵的过程,所以它只是每隔一段时间运行一次。

当我尝试运行代码时,内存使用量会增加一两分钟,然后在运行垃圾回收时突然回到原来的值。 也许你只是没有看足够长的日志?

您可以手动运行垃圾回收,并通过使用--expose-gc标志运行节点并执行global.gc()来自己查看,但是您不应该在生产代码中执行此操作,除非您有非常好的理由。