nodejs JavaScript heap out of memory 错误解决方案

最近在用nodejs处理比较大的数据的时候遇到了这样的错误

1
2
3
4
5
[11168:00000146C0BF6450] 282041 ms: Mark-sweep 1407.0 (1439.8) -> 1407.0 (1439.8) MB, 2475.0 / 0.0 ms last resort
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0000022B3161CEA9 <JSObject>
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

按照字面的解释,是内存溢出了,一直以为nodejs是没有这种情况的所以赶紧谷歌了一下,发现原来是因为官方的默认内存配置太小,官方给的解释如下:

1
2
3
What is the memory limit on a node process?
Currently, by default v8 has a memory limit of 512MB on 32-bit systems, and 1.4GB on 64-bit systems. The limit can be raised by setting --max_old_space_size to a maximum of ~1024 (~1 GB) (32-bit) and ~4096 (~4GB) (64-bit), but it is recommended that you split your single process into several workers if you are hitting memory limits.

来源: https://github.com/nodejs/node/wiki/FAQ

也就是说,默认nodejs 使用的V8引擎官方默认配置是在64位的系统重视1.4g的内存,也正好和上面的提示用量一样,并且内存大小最大为4g,官方还建议如果使用较大内存的话则需要分成多个子worker这样来规避大内存的使用。

所以解决方法有两个

  1. 在执行node命令的时候使用
    –max_old_space_size=4096 这个参数,设置最大4gb的内存
    例如以前的node a.js变成 node --max_old_space_size=8000 a.js

  2. 直接安装 一个npm包 increase-memory-limit 包地址如下:
    https://www.npmjs.com/package/increase-memory-limit

这个包会自动为命令增加 --max_old_space_size=4096 参数。

我个人是倾向直接在命令行中使用参数,为了这点小事再装一个包总觉得不值。