Javascript 内存不足,而 运行 一个 js 脚本每分钟从 api 中获取数据- javascript/node.js

Javascript heap out of memory while running a js script to fetch data from an api every minute- javascript/node.js

我的程序从 API 中抓取约 70 页 1000 项,并使用 Sequelize 将其批量插入到 SQLite 数据库中。循环几次后,node 的内存使用量上升到 1.2GB 左右,然后最终导致程序崩溃并出现此错误:FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory。我已经尝试将 delete 用于我用于响应 API 调用的所有大变量,然后使用 variable = undefined 然后 global.gc(),但是我仍然得到大量的内存使用,最终崩溃。增加 Node.js 的内存上限会有帮助吗?还是它的内存使用量会一直增加直到达到下一个上限?

这是错误的完整输出:


<--- Last few GCs --->

[6760:0x128008000]   436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 


<--- JS stacktrace --->


<--- Last few GCs --->

[6760:0x128008000]   436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[6760:0x128008000]   436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[6760:0x128008000]   436085 ms: Scavenge 4068.7 (4110.5) -> 4068.7 (4110.5) MB, 2.7 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436345 ms: Scavenge 4073.0 (4113.8) -> 4072.9 (4118.8) MB, 9.2 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 
[6760:0x128008000]   436565 ms: Scavenge (reduce) 4079.1 (4122.1) -> 4079.3 (4121.9) MB, 4.6 / 0.0 ms  (average mu = 0.918, current mu = 0.875) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
zsh: segmentation fault  npm start

我是 运行 节点 v15.12.0,配备 16GB 内存的 MacBook Air M1,但据我所知,我认为这不是硬件问题...有谁知道为什么会这样?提前致谢:)

编辑:

原来我使用的节点模块之一从未删除它对 api 调用的响应,所以我重写了代码的那一部分,现在我可以开始了。

根据您提供的数据,无法判断为什么您运行内存不足。

也许工作集(即您需要同时保留的东西的数量)恰好大于您当前的堆限制;在这种情况下,增加限制会有所帮助。通过尝试很容易发现,例如--max-old-space-size=8000(兆字节)。

可能某处存在内存泄漏,可能是在您自己的代码中,也可能是在您的某个第三方模块中。换句话说,也许您不小心让您不再真正需要的对象可访问。

如果您提供了一个复现案例,那么人们可以调查并告诉您更多信息。

旁注:

  • 根据您的输出,堆内存消耗正在增长到 ~4 GB;不确定为什么您认为它的最高容量为 1.2 GB。
  • 永远不需要手动调用 global.gc();当内存压力很高时,垃圾收集器将自动启动。也就是说,如果某些东西使旧对象保持可访问,那么垃圾收集器将无能为力。