webpack打包报错:FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

webpack打包多入口,大项目时,有时候会报内存溢出的错误(FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory),可采用以下步骤来解决问题:

1. 定位问题

可在打包脚本中,加入以下代码,实时监控内存占用情况

process.memoryUsage()

返回值为:

{
  rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472,
  external: 49879,
  arrayBuffers: 9386
}

单位是字节

  1. heapTotalheapUsed 代表 V8 的内存使用情况。
  2. external 代表 V8 管理的,绑定到 JavascriptC++ 对象的内存使用情况。
  3. rss 是驻留集大小, 是给这个进程分配了多少物理内存(占总分配内存的一部分),包含所有的 C++JavaScript 对象与代码。
  4. arrayBuffers 指分配给 ArrayBufferSharedArrayBuffer 的内存,包括所有的 Node.js Buffer。 这也包含在 external 值5. 中。 当 Node.js 用作嵌入式库时,此值可能为 0,因为在这种情况下可能无法跟踪 ArrayBuffer 的分配。

参考链接

2. 解决问题

查看到webpack所需要的大致内存后,将nodejs可用内存调整至其需要的大小,可通多以下几种方式调整:

2.1 nodejs执行相关脚本,直接添加--max-old-space-size参数

node --max-old-space-size=8192 index.js

2.2 如果是通过gulp等处理的打包

找到node_modules/.bin/gulp文件,第一行会为#!/usr/bin/env node,在node后面新增--max-old-space-size xxx就好,
比如:

#!/usr/bin/env node --max_old_space_size=8192 // 8192为MB,可修改为自己需要的大小。

2.3 通过设置全局变量解决

# windows
set NODE_OPTIONS=--max_old_space_size=4096
# mac/linux
export NODE_OPTIONS=--max_old_space_size=4096

2.4 选择npm库increase-memory-limit

但是作者更推荐使用方式2.3

以上4种方式,都可解决内存溢出问题,可按照相关项目实际情况,选择合适的方式.

posted @ 2020-08-05 10:32  cococe  阅读(2822)  评论(2编辑  收藏  举报