Node.js应用频繁停机求助:JavaScript堆内存溢出问题排查
Node.js应用内存溢出问题排查与解决
环境信息
- 服务器配置:16GB内存
- Node.js版本:16.20
- npm版本:9.8
- 托管方式:PM2
- 已配置参数:
--max-old-space-size=13000(ecosystem.config.js及系统高级设置)
问题现象
应用频繁停机,报错提示JavaScript堆内存不足,当前服务已对客户开放,问题亟待解决。
日志详情
堆日志
RSS: 417026048 Heap Total: 355098624 Heap Used: 294669464
换算后Heap Used约281MB,远低于配置的13GB老年代内存上限,说明溢出问题并非来自老年代。
错误日志
<--- 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
错误核心提示为
NewSpace::Rebalance Allocation failed,说明内存溢出发生在新生代内存区(NewSpace),之前配置的--max-old-space-size仅调整老年代内存,对新生代无作用。
解决步骤
1. 调整新生代内存大小
Node.js 16中,新生代默认大小受系统内存限制,可通过--max-semi-space-size参数(单位MB)调整。尝试设置更大的新生代空间,示例配置:
在PM2的ecosystem.config.js中修改:
module.exports = { apps: [ { name: 'your-app-name', script: './path/to/your/app.js', node_args: '--max-old-space-size=13000 --max-semi-space-size=512', // 保留其他原有配置 } ] };
修改后执行pm2 reload ecosystem.config.js使配置生效。
2. 排查内存泄漏
当前堆内存使用量远低于配置上限,但新生代频繁溢出,可能存在短时间内大量小对象创建或内存泄漏:
- 使用
node --inspect ./path/to/your/app.js启动应用,通过Chrome DevTools的Memory面板抓取堆快照,分析未被释放的对象 - 使用
clinic.js工具生成内存使用报告,定位泄漏点
3. 验证PM2配置有效性
执行pm2 show <your-app-name>,查看输出中的node args字段,确认--max-old-space-size=13000和--max-semi-space-size=512已正确加载。
4. 临时应急方案
在彻底解决内存问题前,配置PM2自动重启,避免服务长时间不可用:
module.exports = { apps: [ { name: 'your-app-name', script: './path/to/your/app.js', node_args: '--max-old-space-size=13000 --max-semi-space-size=512', autorestart: true, max_restarts: 10, // 保留其他原有配置 } ] };
内容的提问来源于stack exchange,提问作者Caroline kbp
相关产品推荐
相关产品推荐

