提问者:小点点

NodeJS:达到堆限制分配失败-JavaScript堆内存溢出


我有一个2 GBRAM的VPS(Debian),在那里我运行pm2以执行node. js服务器应用程序。我有一个缓存,每天晚上,凌晨3点,我想把它转储到一个文件中作为备份。

每天3点,我都会收到以下错误:

[717119:0x63345b0]66921944毫秒:标记扫描956.0(1043.7)-

致命错误:达到堆限制分配失败-JavaScript堆内存溢出1:0xb6e500 no /home/userName/webort()[node /home/userName/web/ /home/userName/web]2:0xa7e632[node /home/userName/web/ /home/userName/web]3:0xd47f20 v /home/userName/webUtils /home/userName/webReportOOMFailure(v /home/userName/web内部::Isolate*,char const*,bool)[node /home/userName/web/appName.com/public_html/appNameServer/appNameServer.js]4:0xd482c7 v8::内部V::8::FatalProcessOfOutMemory(v8::内部::Isolate*,char const*,bool)[node /home/userName/web/appName.com/public_html/appNameServer/appNameServer.js]5:0xf25685[node /home/userName/web/appName.com/public_html/appNameServer/appNameServer.js]6:0xf37b6d v8::内部::::Collect垃圾(v8::内部::AllocationSpace,v /home/userName/web内部 /home/userName/web垃圾收集原因,v /home/userName/webGCCallbackFlags)[node /home/userName/web/ /home/userName/web

我知道错误是直截了当的,简单的答案是添加更多的RAM,但我仍然想分享更多的数据:

  1. 在崩溃之前,应用程序消耗了640mb(总),这意味着缓存本身的消耗低于此值。
  2. 当我运行这个节点-e'控制台. log(v8.getHeap统计().heap_size_limit/(1024*1024))'时,结果是1662。
  3. 当我在本地运行缓存转储时,导出项目大约需要3秒,但是在服务器上查看pm2日志,在尝试导出缓存项目直到服务器再次备份之间需要14秒,就好像导出需要更长的时间或者崩溃/重启需要那么多时间,不确定。

2022-12-27T03:00:00.016Z:导出到json 2|appName|

2022-12-27T03:00:14.747Z:服务器在端口的https上运行…

根据上面的数字,640mb(总)和节点至少还有1gb的事实,我不明白为什么首先会有堆内存溢出。

请指教,谢谢


共1个答案

匿名用户

在我的情况下

$ node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
4144

$ export NODE_OPTIONS=--max_old_space_size=8192 && node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
8240

因此,也许您可以使用此变量修改可用内存的数量。

可能您正在使用

fs.writeFileSync('/tmp/test.txt', content);

但也许你可以改成

fs.createWriteStream(path, [options])

然后您不必同时将文件的所有内容存储在内存中。

我使用这样的工具解决了类似的案例:

https://www.jetbrains.com/help/webstorm/v8-cpu-and-memory-profiling.html#ws_node_cpu_profiling

在控制台中,您可以简单地使用--porf标志启动脚本。它将创建巨大的、难以阅读但非常详细的日志,告诉您内存分配。