严重错误:无效的标记压缩接近堆限制分配失败-ionic 3中的JavaScript堆内存不足


Answers:


161

对于那些从Google着手解决此问题的人,可以使用非角度的一般性答案:

每次遇到此错误,都可能是由于内存泄漏或Node <= 10和Node> 10管理内存的方式之间的差异。通常,仅增加分配给Node的内存将允许您的程序运行,但可能无法真正解决实际问题,并且Node进程使用的内存仍可能超过您分配的新内存。我建议您在节点进程开始运行或更新到节点> 10时对其内存使用情况进行性能分析。

我发生了内存泄漏。这是一篇有关调试节点中内存泄漏的出色文章

也就是说,要增加内存,请在运行Node进程的终端中:

export NODE_OPTIONS="--max-old-space-size=8192"

的值max-old-space-size可以是:[2048, 4096, 8192, 16384]

[更新]更多示例,以使您更加清楚:

export NODE_OPTIONS="--max-old-space-size=5120" #increase to 5gb
export NODE_OPTIONS="--max-old-space-size=6144" #increase to 6gb
export NODE_OPTIONS="--max-old-space-size=7168" #increase to 7gb
export NODE_OPTIONS="--max-old-space-size=8192" #increase to 8gb

# and so on...

# formula:
export NODE_OPTIONS="--max-old-space-size=(X * 1024)" #increase to Xgb

# Note: it doesn't have to be multiples of 1024. 
# max-old-space-size can be any number of memory megabytes(MB) you have available.

14
仅供参考,默认值为512 MB。您无需直接跳到该金额的10倍,可以先尝试在512和5120之间进行选择。
卡梅隆·哈德森

谢谢您,此方法适用于所有类型的存在内存问题的应用程序。
invinciblemuffi

5
只是想指出-多数民众赞成在其并非总是表示内存泄漏。可能您正在使用的库使用的内存比以前多了一点。对我们来说,我们next.js开始使用快速刷新功能使我们的应用崩溃。
丹尼尔·库克

@DanielCooke下一个js使用了什么值?您能否与下一个js分享您用于该问题的解决方案
MSD,

@MSD我们似乎获得了4096 max-old-space-size,而next> 9.6。对于生产构建和开发人员
Daniel Cooke

64

就我而言,请修复安装NodeJs 12.10.0版的此问题


1
同样在这里。我刚刚更改了版本及其作品。
brunocascio

9
对于上下文,节点12具有不同的堆管理策略,该策略基于可用内存而不是使用默认内存。更多细节在这里:foundation.nodejs.org/announcements/2019/04/24/...
德里克·道林

没什么对我有用,就是这样。非常感谢您:)
侯赛因·阿莱达鲁斯

我们更新到节点12,错误消失了,比在节点10上管理堆更容易
-Raffaeu

1
@DerekDowling Wayback原因链接断开:web.archive.org/web/20191103115941/https
Grim

63

在centos服务器7上出现相同的问题,但这解决了我的问题:

node --max-old-space-size=X node_modules/@angular/cli/bin/ng build --prod

X = (2048 or 4096 or 8192 o..)记忆的价值在哪里


2
更改x的值后。错误保持不变
Sohail Ahmad

如果错误仍然存​​在,请继续增加大小,直到有足够的内存要处理,最终将防止该错误。我唯一发现我无法克服此错误的原因是,该部分中引用ng serve大量.js文件需要加载到内存中。scriptsangular.json
atconway

我可以将X的值设置为大于8192吗?我有32GB的内存
迭戈

对我来说,在命令行上提供max-old-space-size无效。这可能是与基于nvm的节点的交互?而不是在bash脚本中,我使用了'NODE_OPTIONS =“-max-old-space-size = 2048”节点$ NG build --prod --progress = false' -space-size = 2048 $ NG build --prod --progress = false',而没有。我仍然不知道为什么。
西蒙H


23

ng build在Visual Studio代码中执行命令时遇到了相同的错误。但是当我按以下顺序在Windows命令行中执行相同的操作时,我可以成功构建。

第1步。

set NODE_OPTIONS=--max_old_space_size=4096

第2步。

ng build

11

当我在Visual Studio代码中执行以下语句时,出现相同的错误消息。但是当我在Windows命令行中执行相同的操作时,我可以成功构建。

npm install -g increase-memory-limit
increase-memory-limit
set NODE_OPTIONS=--max_old_space_size=4096
ng build -c deploy --build-optimizer --aot --prod --sourceMap

7
node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --baseHref=/baseUrl/ --prod=true

20
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以改善其长期价值。
Eric Leschinski

7

由于某些原因,上述所有答案均对我不起作用,因此我进行了以下操作来解决我的问题:

  1. 我必须先删除node_modules文件夹
  2. 在我的PC上重新安装node.js并
  3. 然后 npm install

步骤2不是强制性的。我尝试了上层解决方案,它同样适用于我,而无需执行第2步
分析师

好吧,您可能不需要第二步,我只分享了对我
有用的方法

5

更换线

"start": "ng serve -o --port 4300 --configuration=en"

"start": "node --max_old_space_size=5096 node_modules/@angular/cli/bin/ng serve -o --port 4300 --configuration=en"

注意:

  1. -4300端口不是恒定的,取决于您选择的端口。

  2. --max_old_space_size = 5096也不恒定;任何值1024,2048,4096等


5

在我的情况下,这是递归导致反应耗尽所有内存。

这是在我重构代码时没有注意到的。

const SumComponent = () => {
  return (
    <>
      <SumComponent />
    </>
  ) 
}

在其他节点应用程序中,它可能类似于:

const someFunction = () => {
  ...
  someFunction(); 
  ...
}

1
为什么这是一个问题?<> </>应该在React中有效,而不是使用<React.Fragment>对吗?
Joelgullander

@Codehiker是的,它在React 16中的新语法
Rusty

4
递归是SumComponent包含一个SumComponent(其中包含一个SumComponent包含一个SumComponent...)
石头

5

节点--max_old_space_size = 4096 ./node_modules/@angular/cli/bin/ng build --prod --build-optimizer

添加参数--build-optimizer 解决了我的问题。

更新:

我不确定为什么只添加--build-optimizer可以解决问题,但是根据angular docs,应该在启用aot的情况下使用它,因此更新的命令应如下所示

--build-optimizer=true --aot=true

角度构建文档


4

在您的项目文件夹中运行此命令。使用服务而不是构建

node --max_old_space_size=8000 node_modules/@angular/cli/bin/ng serve  --prod --port=4202

3

对我来说,这是firebase软件包的问题。

对于您的package.json,仅添加“ @ firebase / database”:“ 0.2.1”,重新安装node_modules即可。



2

请检查您的节点版本:

   $  node -v

如果它的版本为10.1.1,则需要通过以下命令更新根级别节点版本

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash


$ source ~/.nvm/nvm.sh

$ nvm ls

$ nvm install 12.18.1

完成后,请重新启动终端机或Visual Studio。

100美元

对于离子用户请在您的package.json中添加以下代码 对于离子用户

 "ionic:build": "node --max-old-space-size=16384 ./node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js build",
    


实际上,如果您通过构建网络app-scripts,则此方法有效,但是如果您构建android或类似脚本的ionic cordova build android方式呢?
穆罕默德·穆萨

2

另一个非角度的答案(我在使用AWS Amplify构建React应用程序时遇到了同样的问题)。

如伊曼纽尔(Emmanuel)所述,这似乎是由于节点v10与节点v12处理内存的方式不同而引起的。

我试图增加内存,但无济于事。但是使用节点v12做到了。

检查如何nvm use $VERSION_NODE_12按照@atlesp的说明将其添加到构建设置中https://github.com/aws-amplify/amplify-console/issues/440#issuecomment-602626451 图片


1

对我来说,问题在于有一个额外的node_modules文件夹,我将其重命名node_modules_old并运行一个npm install来生成一个new node_modules。不知何故,构建仍必须继续使用该node_modules_old文件夹,因此我移出node_modules_old目录以解决此问题。


1

只需在终端中输入以下内容:

export NODE_OPTIONS="--max-old-space-size=8192"



0

检查您的文件夹名称。如果您的文件夹名称包含空格,则会产生此类问题。重命名不带空格。希望它能工作。


0

如果在VSCode上运行React应用程序时发生这种情况,请检查您的propTypes,未定义的Proptypes会导致相同的问题。


0

对我而言,出现此错误是因为我无法访问我的angular.json文件中设置的dist文件夹的输出路径。用更新的凭据重新连接到远程路径后,错误消失了。


0

#!/ usr / bin / env节点-ionic-app-scripts.js中的max-old-space-size = 4096

修改中

node_modules / .bin / ionic-app-scripts.cmd

通过增加:

@IF存在“%〜dp0 \ node.exe”(“%〜dp0 \ node.exe”“%〜dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js”%*)ELSE( @SETLOCAL @SET PATHEXT =%PATHEXT:;。JS; =;%节点--max_old_space_size = 4096“%〜dp0 .. @ ionic \ app-scripts \ bin \ ionic-app-scripts.js”%*)

辛勤工作


0

对我来说,build删除所有工作后,我在React项目中运行eslint和更漂亮的修复程序并使用目录格式化时遇到了这个问题。我猜这是因为文件太多。


0

我想有很多方法可以解决此错误!

在我这边,我有一个循环package.json。项目A对项目B具有依赖关系,而项目B对项目A具有依赖关系。


0

有时候,简单是成功的关键。搜索while (i <= 10000) {}而不增加i代码;)


0

在为我的项目更新了所有库(如nodejs,typescript,yarn,npm等)后,此问题消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.