javascript - 如何处理 Node js 中与内存分配相关的危机?

标签 javascript node.js memory-management memory-leaks setinterval

我正在尝试用 faker 的一些随机数据填充 mongoDB 数据库。所以我使用 setInterval 函数一遍又一遍地运行数据库查询,但问题是当我监控内存使用情况时,它只会不断增长,直到达到 v8 引擎的限制,无论我增加多少限制,它都会崩溃无论如何,这只是时间问题。

const faker = require("faker")
let userName; 
let email; 

setInterval(async () => {
  userName = faker.name.findName(); 
  email = faker.internet.email(); 
  await User.create({
    userName: userName,
    email: email,
  })
    .then(() => {
      //getting memory usage
      console.log(process.memoryUsage().heapUsed / 1024 / 1024);
    })
    .catch(err => {
      console.log(err);
    });
});

我应该如何管理内存分配以防止崩溃? 这是否被认为是内存泄漏?

最佳答案

不加时间地调用setInterval,这会尽快添加到回调队列中,没有任何限制。如果将项目添加到队列的速度比删除项目的速度快,则内存将始终增长。

*编辑:要准确了解执行 setInterval 时事件循环和回调队列会发生什么,我建议观看 Philip Roberts 的精彩 JSConf 演讲。和/或Jake Archibald .

您有几个选择。您可以更改为 setTimeout,然后在最后一次调用完成后在 .then 中调用另一个 setTimeout。这本质上会序列化它。

更细致的方法是使用计数器来限制并发 mongoDB 写入的最大数量。这样您就可以同时进行一定数量的写入。在此示例中,它将并发写入数量限制为 10。这应该可以防止您的内存无限制地增长。

const faker = require("faker")
let userName; 
let email; 
let numRunning = 0;
let maxRunning = 10;

setInterval(async () => {
  if (numRunning > maxRunning) return;
  numRunning++;
  userName = faker.name.findName(); 
  email = faker.internet.email(); 
  await User.create({
    userName: createdUser.userName,
    age: createdUser.age,
  })
    .then(() => {
      numRunning--;
      //getting memory usage
      console.log(process.memoryUsage().heapUsed / 1024 / 1024);
    })
    .catch(err => {
      numRunning--;
      console.log(err);
    });
}, 50);

我还添加了 50ms 的间隔。 setInterval 为零确实不是一个好主意。有时有充分的理由对 setTimeout 使用零,但我想不出对 setInterval 使用零的充分理由。

关于javascript - 如何处理 Node js 中与内存分配相关的危机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60902482/

相关文章:

javascript - 将生成的 Canvas 图像发送到网站服务器?

javascript - 如何从弹出窗口调用父函数?

node.js - 在ElectronJS(Asar)中编写JSON文件

c++ - c++中删除类或结构时,删除了多少?

c - fscanf 总线错误 : 10 when switching from Snow Leopard to Lion

javascript - 如何检测元素是否在其容器之外?

javascript - 在 jquery 中增加 $_SESSION 索引

javascript - 监听来自另一个 Node.js 应用程序的通知

node.js - 如何从 docker 容器运行 webpack 构建?

c++ - 堆栈内存未释放