You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ---&gt;

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:42:04