致命错误:无效的标记-压缩接近堆限制分配失败- JavaScript堆在Ionic 3内存不足

当我使用ionic serve命令运行Ionic 3项目时,我会得到这个错误:

 FATAL ERROR: invalid mark-compacts near heap limit Allocation failed - JavaScript截图

769387 次浏览

试试这个解决方案,在论坛上的一个旧消息中指出:3.7.0: iOS build with——prod not working

打开node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js

将第一行改为:

#!/usr/bin/env node

#!/usr/bin/env node --max-old-space-size=4096

尝试1024和2048的值,但对于一个相对较大的应用程序,你可能需要4096。

我在CentOS服务器7上也有同样的问题,但这解决了我的问题:

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

其中X = (2048 or 4096 or 8192 o..)是内存的值。

对我来说,这是一个Firebase包的问题。

只添加“@firebase/database": "0.2.1"你的package.json文件。重新安装node_modules,它可以工作。

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

在我的案例中,我通过安装Node.js 12.10.0版本解决了这个问题。

在项目文件夹中运行此命令。使用服务代替build

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

当我在Visual Studio Code中执行以下语句时,我得到了相同的错误消息。但是当我在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

检查文件夹名称。如果文件夹名中有空格,就会产生这类问题。不带空格的重命名。

我删除了现有的Node.js模块,并运行以下命令来解决我的问题:

npm install -all
npm audit fix

对于那些从谷歌中找到这个问题的人,一个非angular的一般答案是:

大多数情况下,当你遇到这个错误时,可能是因为内存泄漏,库的添加/版本升级或Node.js在版本之间管理内存的方式不同(例如Node.js版本<= 10和Node.js版本>10)。

通常只要增加分配给node .js的内存就可以让你的程序运行但可能并不能真正解决问题,而节点进程使用的内存仍然可能超过你分配的新内存。我建议在Node.js进程开始运行或更新到Node.js >时分析内存使用情况;10.

内存泄漏。 下面是关于调试Node.js中的内存泄漏的一篇很棒的文章

也就是说,为了增加内存,在运行Node.js进程的终端中:

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 5 GB
export NODE_OPTIONS="--max-old-space-size=6144" # Increase to 6 GB
export NODE_OPTIONS="--max-old-space-size=7168" # Increase to 7 GB
export NODE_OPTIONS="--max-old-space-size=8192" # Increase to 8 GB


# and so on...


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


# 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.

查看max-old-space-size的当前值(单位:MB)

要查看max-old-space-size(以MB为单位)的当前值(不精确但非常接近),请在终端中运行

node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'

由于某些原因,之前所有的答案对我都不起作用。我做了以下来解决我的问题:

  1. 我必须首先删除node_modules文件夹
  2. 在我的电脑上重新安装Node.js
  3. 然后npm install

如果在Visual Studio Code中运行React应用程序时发生了这种情况,请检查您的propTypes,未定义的propTypes会导致同样的问题。

更换线路

"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 too not constant;任意值1024、2048、4096等

对于我来说,我得到了这个错误,因为我失去了对我的angular中dist文件夹设置的输出路径的访问。json文件。在我用更新的凭证重新连接到远程路径后,错误消失了。

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

步骤1。

set NODE_OPTIONS=--max_old_space_size=4096

步骤2。

ng build

在我的例子中,是递归导致React用完所有内存。

这发生在我重构代码时,我没有注意到这一点。

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

在其他Node.js应用程序中,这可能是这样的:

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

在我的例子中,添加参数--build-optimizer解决了这个问题:

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

我不知道为什么添加only——build-optimizer可以解决这个问题,但根据Angular文档,它应该在启用AOT编译的情况下使用,所以更新后的命令应该如下所示:

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

< a href = " https://angular。io/cli/build" rel="nofollow noreferrer">Angular构建文档 . io/cli/build" rel="nofollow noreferrer">

对我来说,问题是有一个额外的node_modules文件夹,我将其重命名为node_modules_old,并运行npm install来生成一个新的node_modules。不知何故,构建必须仍然选择node_modules_old文件夹,所以我从目录中移动node_modules_old来解决这个问题。

请检查你的Node.js版本:

   node -v

If it’s 10.1.1 something, then you need to update your root level Node.js version via the below commands:

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美元。

对于Ionic用户,请在package.json中添加以下代码

For Ionic user .

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

ionic-app-scripts.js文件中的#!/usr/bin/env node --max-old-space-size=4096没有工作。

通过添加修改node_modules /。bin / ionic-app-scripts.cmd

@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe"  "%~dp0\..\@ionic\app-scripts\bin\ionic-app-scripts.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node --max_old_space_size=4096  "%~dp0\..\@ionic\app-scripts\bin\ionic-app-scripts.js" %*
)

最后工作。

另一个非angular的答案(我在AWS Amplify上构建React应用时也遇到了同样的问题)。

正如Emmanuel所提到的,这似乎来自Node.js v10和Node.js v12处理内存的方式的差异。

我试着增加记忆,但没有用。但是使用Node.js v12做到了。

检查如何将nvm use $VERSION_NODE_12添加到构建设置理查德解释说

frontend:
phases:
preBuild:
commands:
- nvm use $VERSION_NODE_12
- npm ci
build:
commands:
- nvm use $VERSION_NODE_12
- node -v
- npm run-script build

对我来说,我在React项目中运行ESLint更漂亮时遇到了这个问题。取出后,一切都正常了。

我猜这是因为在build目录下有太多的文件。

我想有很多方法可以达到这个错误!

在我这边,我在package.json中有一个循环。项目A依赖于项目B,项目B又依赖于项目A。

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

这个问题在我更新了我的所有库,如Node.js, TypeScript, , npm等我的项目后消失了。

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

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

当超过Node.js允许的默认最大内存时,就会发生错误。所有这些操作都增加了允许的最大内存。

从Node.js 12更新到Node.js 14为我解决了这个问题。


更新
现在Node.js 16可用,我建议更新到Node.js的最新可用版本。

对于我来说,我有一个语法错误(没有显示出来),并导致了这个错误。

当我运行angular 'ng serve'时,我也有类似的问题:

致命错误:无效的标记-压缩接近堆限制分配失败- JavaScript堆内存不足;

在我的例子中,我发现我的Angular应用程序使用了惰性加载。一个模块已经导入到自己的路由模块,但有人做了一个导入它到应用程序模块,这导致递归(?)加载。

这会导致内存不足。

只需执行以下命令:

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

我没有使用ng build,而是在终端中执行以下命令来解决这个问题。

 node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod

然后执行ng serve

这就是我的终端机

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.


Try the new cross-platform PowerShell https://aka.ms/pscore6


PS D:\ProjectPath\Project1> node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng build --prod

对于那些从谷歌找到这个问题并想要在Dockerfile中修复这个问题的人,这是一个非angular的通用JavaScript答案(将6144替换为你想要分配的以兆字节为单位的内存量)。

我的实现在Node.js v14.1.0中工作,由Docker版本20.10.5执行,使用气流v2.0.1中的DockerOperator构建55c4c88)。

FROM node:14.1.0


# Create app directory
WORKDIR /tmp/dockerspace/


# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
COPY package*.json ./


RUN npm install


# Bundle app source
COPY . .


CMD node --max-old-space-size=6144 app.js

如果你在Windows上开发,在发布时遇到这个问题,通过官方网站升级Node.js。

每更新一个Node.js版本,内存使用处理都会增加,尽管我没有找到确切的增加数字。

这是唯一对我有效的解决办法。我花了整整一个周末甚至更长的时间才解决这个问题。

我在Angular上也遇到了同样的问题。然后我写了

"serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve"

这个脚本到package.json脚本,为我解决了这个问题。

并运行project this命令:

npm run serve

我使用的是Node.js v-14.17的最新稳定版本。我在新的Angular Ionic项目中也遇到了同样的问题,尝试了之前的大多数答案都没有成功。

最终在升级到Node.js 16.4.2 LTS后,修复了这个问题。

在我的例子中,错误是由for ...循环中不恰当地使用条件引起的。而不是:

for (let t = startNo; t <= endNo; t++) {}

我有:

for (let t = startNo; endNo; t++) {}

窗户

从控制面板转到系统高级系统设置环境变量(用户或系统)

mceclip0.png .png

或者这可以在PowerShell中完成:

$env:NODE_OPTIONS="--max-old-space-size=8192"

如果需要,还可以增加这个数字。我们已经看到一些人需要增加到14gb的一些更大的项目!

Linux / macOS

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

执行如下命令:

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

检查你已经有多少钱了:

> node
> v8.getHeapStatistics()
{
total_heap_size: 6049792,
total_heap_size_executable: 524288,
total_physical_size: 5477720,
total_available_size: 1094444024,
used_heap_size: 4141728,
heap_size_limit: 1098907648,
malloced_memory: 8192,
peak_malloced_memory: 582752,
does_zap_garbage: 0,
number_of_native_contexts: 2,
number_of_detached_contexts: 0
}

然后heap_size_limit: 1098907648

我也有同样的问题,在我的情况下,安装aws-sdk后,不是内存空间。我解决了将导入更改为如下所示:

aws-sdk在节点应用程序部署后不启动

  1. 出口NODE_OPTIONS =“——max-old-space-size = 6144”;#它将增加到6gb。
< p >——如果不解决尝试这2的步骤 ------------- 2)只要更新你的节点版本到最新版本就可以解决这个问题 < p >——如果没有解决试试这第三步 ------------- 3)在windows终端上运行这个命令。 set NODE_OPTIONS=--max_old_space_size=4096 < / p >

对我来说,这就像模块导入自己一样愚蠢:

// worker.js
import { worker } from './worker'