Javascript/Node.js数组内存管理

Javascript/Node.js array memory management

本文关键字:内存 管理 数组 js Node Javascript      更新时间:2023-09-26

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

首先,我在global中创建了一个数组对象,并创建了一个生成器来不间断地将元素推入数组。

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

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

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

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

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

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

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

当我尝试运行您的代码时,内存使用确实增加了一两分钟,然后在垃圾收集运行时突然恢复到原始值。也许你只是看日志的时间不够长?

您可以手动运行垃圾收集,并通过运行带有--expose-gc标志的node并执行global.gc()来自己看到这一点,但是您不应该在在生产代码中这样做,除非您有非常很好的理由。