nodejs作为前端开发必不可少的工具,随着本地开发随着项目越来越庞大,在启动项目时,webpack需要处理大量依赖,占用大量的内存空间,从而导致堆内存不足,就会出现npm run dev启动的时候报内存不足的错误,一般错误信息如下

<--- Last few GCs --->

[873:0x1020aa000]    47109 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.3 / 0.0 ms  (average mu = 0.995, current mu = 0.999) allocation failure 
[873:0x1020aa000]    47231 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.2 / 0.0 ms  (average mu = 0.995, current mu = 0.999) allocation failure 
[873:0x1020aa000]    47353 ms: Scavenge 2107.9 (2131.9) -> 2092.1 (2131.9) MB, 0.2 / 0.0 ms  (average mu = 0.995, current mu = 0.999) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x27af028cfc7d]
Security context: 0x00a9d921d971 <JSObject>
    1: push [0xa9d9205831](this=0x00a92dc86431 <JSArray[112813858]>,0x00a9f2d5fdf1 <String[17]\: \n                >)
    2: /* anonymous */ [0xa92dc86471] [0x00a9bba025b1 <undefined>:~1] [pc=0x27af02959ff7](this=0x00a9051847e1 <JSGlobal Object>,0x00a92dc86531 <Object map = 0xa982312831>,0x00a9f2d4f6a9 <JSFunction exports.escapeXML (sfi = 0xa9f2d4edc9)>,0x00...

FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory

--max-old-space-size=SIZE

--max-old-space-size是 V8 引擎的一个标志,用于控制 Old space 的最大大小,单位是M(兆)。Old space 是 V8 托管堆(也称为垃圾收集堆)中最大和最可配置的部分,其中存放着 JavaScript 对象。当内存消耗接近极限时,V8将花费更多时间在垃圾收集上,以释放未使用的内存,如果内存超过预设的值,就会抛出错误。

在具有 2GB 内存的机器上,可以将--max-old-space-size设置为大约 1.5GB 以留出一些内存用于其他用途并避免交换。设置环境变量NODE_OPTIONS=--max-old-space-size=1536环境变量允许增加节点的最大堆大小。

需要注意的是,--max-old-space-size 标志设置的值为一个全局值,并且可以被每个 Node 进程使用。因此,不需要在每次运行 Node 命令时将此值作为参数传递。

如果需要单独设置,可以启动node时后面临时指定即可,例如node --max-old-space-size=1536 index.js

解决问题

上述的问题可以通过增大内存分配解决,即在 package.json 里面的启动命令加入

{
  "scripts": {
    "start": "NODE_OPTIONS=--max-old-space-size=1536 & env-cmd -f ./env/.dev.env nodemon bin/www.js --watch"
  }
}