我有一个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,但我仍然想分享更多的数据:
节点-e'控制台. log(v8.getHeap统计().heap_size_limit/(1024*1024))'
时,结果是1662。2022-12-27T03:00:00.016Z:导出到json 2|appName|
2022-12-27T03:00:14.747Z:服务器在端口的https上运行…
根据上面的数字,640mb(总)和节点至少还有1gb的事实,我不明白为什么首先会有堆内存溢出。
请指教,谢谢
在我的情况下
$ 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
标志启动脚本。它将创建巨大的、难以阅读但非常详细的日志,告诉您内存分配。