Linux 构建 Vue 项目报错 JavaScript heap out of memory(2024/06/26)
文章目录
- Linux 构建 Vue 项目报错 JavaScript heap out of memory(2024/06/26)
- 一. 产生环境
- 二. 问题描述
- 三. 原因分析
- 四. 解决方法
- 五. 疑问
一. 产生环境
- Debian GNU/Linux 12;
- NodeJS 16.19.0;
二. 问题描述
在 Linux 环境下,通过 npm run build
构建 Vue 项目的时候遇到如下错误:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
三. 原因分析
根据报错信息可知是堆内存空间不足导致的,但构建所用的 Linux 机器物理内存为 256G,通过监控资源占用发现在 node 构建时内存并未占满,所以猜测是系统对进程所用的最大内存进行了限制。可能的限制如下:
-
查看 Linux 系统对进程可分配最大内存的限制;
$ ulimit -m unlimited
结果为 unlimited,即不限制,因此不是系统限制了进程所能分配的最大内存。
-
查看 Node.js 的默认内存限制;
$ node -e "console.log(v8.getHeapStatistics().heap_size_limit / 1024 / 1024 + ' MB')" 4144 MB
结果为 4144 MB,显而易见问题出在这里,Node.js 的默认内存限制太小导致构建时获取不到足够的堆内存。
四. 解决方法
调整 Node.js 的默认内存限制,例如增加到 16G,下面介绍两种实现方法(原理相同):
-
命令行设置环境变量;
-
Windows
$ set NODE_OPTIONS="--max_old_space_size=16384" && npm run build
-
Linux
$ export NODE_OPTIONS="--max_old_space_size=16384" && npm run build
-
-
package.json 的 scripts 部分直接增加内存限制;
-
Windows
"scripts": { "build": "set NODE_OPTIONS='--max_old_space_size=16384' && vue-cli-service build" }
-
Linux
"scripts": { "build": "NODE_OPTIONS='--max_old_space_size=16384' vue-cli-service build" }
-
跨平台
$ npm install cross-env
"scripts": { "build": "cross-env NODE_OPTIONS='--max_old_space_size=16384' vue-cli-service build" }
-
五. 疑问
Windows 环境下 Node.js 的默认内存限制也是 4144 MB,但是在不增加 Node.js 默认内存限制的情况下可以构建成功,原因不详???