fatal error: reached heap limit allocation failed-javascript heap out of memory

1,203 阅读2分钟

原因

打包内存超出 node 最大内存限制 --max_old_space_size Old space是 V8 托管(也称为垃圾收集)堆(即 JavaScript 对象所在的位置)中最大和最可配置的部分,而 --max-old-space-size 标志控制其最大大小。 随着内存消耗接近极限,V8 将花费更多时间在垃圾收集上,以释放未使用的内存。

如果堆内存消耗(即 GC 无法释放的活动对象)超过限制,V8 将使您的进程崩溃(因为缺乏替代方案),因此您不想将其设置得太低。 当然,如果您将其设置得太高,那么 V8 将允许的额外堆使用可能会导致您的整个系统内存不足(并且由于缺乏替代方案而交换或终止随机进程)。

总之,在具有 2GB 内存的机器上,我可能会将 --max-old-space-size 设置为大约 1.5GB 以留出一些内存用于其他用途并避免交换。

查询当前 node 内存限制

image.png

 node -p "v8.getHeapStatistics().heap_size_limit  / 1024 /1024"

解决方案

环境变量的修改方式

windows

  1. cmd中执行setx NODE_OPTIONS --max-old-space-size=8192
  2. 直接在环境变量窗口中编辑用户级别的环境变量 image.png{{{width="auto" height="auto"}}}

类unix系统(Linux/macOS)

1.export NODE_OPTIONS="--max-old-space-size=8192" 2.放到相应的环境变量配置文件中

基于项目配置

通过运行直接注入

"scripts": {
    "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 "
}

命令行方式

"scripts": {
    "build": "node --max_old_space_size=1024000 ./node_modules/vite/bin/vite.js build "
}
node --max_old_space_size=1024000 ./node_modules/vite/bin/vite.js build 

注意

如果是在 vscode 中 vscode 的配置对于上述配置不适用,如果不适用,在 .settings.json 中设置node 内存限制

{
  "node.memoryLimit": 6000 // 这里的数字表示内存限制,单位是兆字节。你可以根据需要调整这个值。
}

文章参考

github.com/vitejs/vite…

blog.csdn.net/iotzzh/arti…

www.jianshu.com/p/a0a0b57a3…

[segmentfault.com/q/101000004…