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"
}
}