我在16 GB的机器上有一个node js应用程序,托管在PM2上。node版本是16.20,npm版本是9.8。我在ecosystem.config.js和高级系统设置中都设置了--max-old-space-size=13000。我仍然看到频繁的应用程序停机。我需要帮助解决这个问题,因为客户正在使用该应用程序,他们正在将其升级到更高的管理层。下面是我捕获的堆日志和应用程序关闭时记录的错误。
堆日志:“RSS:417026048堆总数:355098624使用的堆:294669464”
错误日志:
> <--- Last few GCs --->
>
> [3428:0000015046ABE0B0] 6312 ms: Scavenge 67.3 (88.6) -> 60.3
> (90.7) MB, 23.2 / 0.2 ms (average mu = 0.978, current mu = 0.978)
> allocation failure [3428:0000015046ABE0B0] 6705 ms: Scavenge 72.1
> (91.3) -> 63.7 (96.3) MB, 29.5 / 0.0 ms (average mu = 0.978, current
> mu = 0.978) allocation failure [3428:0000015046ABE0B0] 6962 ms:
> Scavenge 76.7 (96.7) -> 65.1 (97.8) MB, 20.8 / 0.0 ms (average mu =
> 0.978, current mu = 0.978) allocation failure
>
>
> <--- JS stacktrace --->
>
> FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap
> out of memory 1: 00007FF6FB4B15AF 2: 00007FF6FB3CC5EF 3:
> 00007FF6FC0AEF82 4: 00007FF6FBD5D5DE 5: 00007FF6FB8F7DC7 6:
> 00007FF6FC1DB734 7: 00007FF6FC1DDD4B 8: 00007FF6FC1DDA81 9:
> 00007FF6FC1DC3EB 10: 00007FF6FC1DC131 11: 00007FF6FC184E17 12:
> 00007FF6FC163BFC 13: 00007FF6FC184960 14: 00007FF6FC1850C6 15:
> 00007FF6FC184EB2 16: 00007FF6FC165C7D 17: 00007FF6FC156374 18:
> 00007FF6FC1626B7 19: 00007FF6FC15DFB1 20: 00007FF6FBCF4FE1 21:
> 00007FF6FBCC6149 22: 00007FF6FBCC6C1A 23: 00007FF6FB3CEF7D 24:
> 00007FF6FB4FF30D 25: 00007FF6FC319250 26: 00007FF91A5D7AC4 27:
> 00007FF91CB8A351 RtlUserThreadStart+33
>
>
> #
> # Fatal error in , line 0
> # Fatal process out of memory: Zone
> #
> #
> #
> #FailureMessage Object: 00000037EEBFA0D0
字符串
1条答案
按热度按时间5hcedyr01#
显然,应用程序试图使用比分配给它的内存更多的内存。
我会这么做
1.寻找可以消耗更多内存的地方。例如:大型文件处理(图像、视频、电子表格等)
1.查找循环中的内存分配(例如:在循环中阅读文件的内容并将其存储在数组中)
1.查看网络连接是否被正确丢弃&确保在它们之后没有引用
1.查找更新局部-全局值的位置。例如:在每个传入请求中更新全局或文件全局数组
1.如果发现#4和#5的出现,则很容易修复。
1.对于#1和#2,我会找出一种流线型的方法来处理大文件,比如创建队列并将处理任务卸载到另一个进程等。
1.如果内存使用仅仅是由于处理而导致的,并且没有检测到内存泄漏(是的,前4个点表示内存泄漏),我会收集内存使用的峰值并将其设置为node.js进程(Node.js中有一个参数可以将可用内存更改为Node.js进程)。