【问题标题】:Very simply Node.js application uses multiple GB memory非常简单的 Node.js 应用程序使用多个 GB 内存
【发布时间】:2021-05-14 20:08:08
【问题描述】:

我有一个非常简单的 Node.js 应用程序:

const fs = require('fs')
const axios = require('axios')

async function test() {
  const {data} = await axios.get('http://speedtest.ftp.otenet.gr/files/test100k.db')

  fs.mkdirSync('./data', {
    recursive: true
  })

  for (let i = 0; i < 300_000; i++) {
    fs.writeFileSync(`./data/${Date.now()}`, data)
    console.log(i)
  }
}

test()

大约一分钟后,应用程序达到 15 GB 左右的内存(由于内存不足,我不得不取消它)。我想知道原因。我只是下载一个 100k 的文件并保存 300 000 次。为什么内存增加这么多,有什么解决方案可以防止这个问题(使用流除外)?

【问题讨论】:

    标签: node.js memory-management out-of-memory


    【解决方案1】:

    欢迎来到垃圾收集系统。

    您在一个巨大的循环中不停地运行代码,并且没有为垃圾收集留下任何循环,因此它会在中断代码流以尝试通过垃圾收集回收一些内存之前使用尽可能多的内存。垃圾收集器通常会等到解释器不忙,然后再进行垃圾收集。但是您的代码处于一个巨大的循环中,其中循环的每次迭代都会使用一些内存,因此您永远不会给 GC 任何空闲时间来运行它。

    仅供参考,因为这显然是一个虚构的测试程序,为了建议如何最好地解决这样的问题,我们需要看到一个真实的问题和真实的代码,以便我们可以为该实际代码提出最佳解决方案。

    【讨论】:

    • 谢谢@jfriend00,但即使我尝试像“node --expose-gc index.js”这样的东西并在每个循环中调用“global.gc()”,内存也会增加并最终消耗多个 GB。
    • @Nrgyzer - 是的,你无法真正控制 GC。就是这样。它在完成大部分工作之前等待解释器空闲。如果您展示的是一段真实的代码,而不是这个测试代码,我们可以建议更好的处理方法。或者切换到 C++ 或 Rust 等非 GC 环境,您可以在其中手动控制分配和释放。
    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多