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

Posted

技术标签:

【中文标题】致命错误:接近堆限制的无效标记压缩分配失败 - Ionic 3 中的 JavaScript 堆内存不足【英文标题】:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory in Ionic 3 【发布时间】:2019-04-13 07:46:45 【问题描述】:

当我使用 ionic serve 命令运行 Ionic 3 项目时,我收到此错误:

【问题讨论】:

查看这个答案:***.com/questions/38558989/node-js-heap-out-of-memory/… 【参考方案1】:
    export NODE_OPTIONS="--max-old-space-size=6144" #它将增加到 6gb。

--------如果未解决,请尝试第二步------------- 2)只需将您的节点版本更新到最新版本即可解决此问题。

--------如果未解决,请尝试第三步------------- 3)只需在 Windows 终端中运行此命令。 set NODE_OPTIONS=--max_old_space_size=4096

【讨论】:

【参考方案2】:

在安装 aws-sdk 之后,我遇到了同样的问题,而不是内存空间。我解决了它,将导入更改为要求,就像这篇文章一样:

aws-sdk in node app after deploying does not start

【讨论】:

【参考方案3】:

对于那些从 Google 提出这个问题的人的非 Angular 通用答案:

每次遇到此错误可能是因为内存泄漏或 Node.js 10 管理内存的方式不同。

通常只是增加分配给 Node.js 的内存将允许您的程序运行但可能无法真正解决真正的问题并且节点进程使用的内存仍然可能超过您分配的新内存.我建议在 Node.js 进程开始运行或更新到 Node.js > 10 时分析内存使用情况。

我有内存泄漏。 这是a great article 在 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))'

【讨论】:

仅供参考,默认为 512 MB。你不需要直接跳到那个数量的 10 倍,你可以先尝试 512 到 5120 之间的东西。 感谢这适用于所有类型的有内存问题的应用程序。 只想指出 - 这并不总是表明内存泄漏。也许您正在使用的库使用的内存比以前多一点。对于我们next.js 开始使用快速刷新功能使我们的应用程序崩溃。 @MikhailVasin 查看我回答中的最后一个 cmets。我知道它没有。我只是把它放在那里,以供那些想要以 GB 为单位的公共内存增量的人使用。 如果您可以在此答案中添加如何通过终端读取现有值,那就太棒了。【参考方案4】:

运行这个命令:

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

【讨论】:

【参考方案5】:

Windows

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

或者这可以通过以下方式在 PowerShell 中完成:

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

如有必要,您也可以增加此数字。我们已经看到人们需要为一些较大的项目将其增加到 14 GB!

Linux/macOS

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

【讨论】:

我有 nodeJS 10.15.3,我在 Windows 10 上尝试了 NODE-OPTIONS 解决方案,但没有奏效。还有其他解决方案吗? @VenomBerry 你能运行 WSL 吗?为什么要在没有 linux 子系统的标准 Windows 上运行这些东西来伤害自己。 看起来现在我们必须在系统设置中使用max-old-space-size=8192,而不使用前导破折号。使用 -- 我在 Node.js 中遇到了 Fatal javascript OOM in GC during deserialization 错误。但可能它只与最新版本有关。 @it3xl 与您仍然需要使用的较新节点版本 - 否则不会被视为更改。您遇到的问题是(至少某些)较新版本的节点 node 实际上会在您要求的数字上增加 24 个字节,因此要求 4096MB 变成 4294967320 字节,或 4096.00002MB 哪个节点无法反序列化...尝试4000【参考方案6】:

在我的情况下,错误是由于在 for ... 循环中不正确使用条件引起的。而不是:

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

我有:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

如果您在 Windows 上开发并在发布时遇到此问题,请通过 the official site 升级 Node.js。

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

这是唯一对我有用的解决方案。我花了整个周末甚至更多时间来解决这个问题。

【讨论】:

【参考方案9】:

在我为我的项目更新了所有库(如 Node.js、TypeScript、Yarn、npm 等)后,此问题就消失了。

【讨论】:

【参考方案10】:

对我来说,在我的 React 项目中运行 ESLint、Prettier 修复和使用 build 目录格式化时遇到了这个问题。删除后,一切正常。

我猜这是因为文件太多。

【讨论】:

【参考方案11】:

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

正如 Emmanuel 所说,这似乎来自 Node.js v10 与 Node.js v12 处理内存的方式不同。

我尝试增加内存但无济于事。但是使用 Node.js v12 做到了。

检查如何将nvm use $VERSION_NODE_12 添加到构建设置as explained by richard

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

【讨论】:

【参考方案12】: 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" %*
)

终于成功了。

【讨论】:

【参考方案13】:

请检查您的 Node.js 版本:

   node -v

如果是 10.1.1 版本,那么您需要通过以下命令更新您的根级 Node.js 版本:

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 中添加以下代码

 "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,如何?【参考方案14】:

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

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

我不确定为什么只添加 --build-optimizer 可以解决问题,但根据 Angular 文档,它应该与启用提前 (AOT) 编译一起使用,因此更新后的命令应该如下所示:

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

Angular build documentation

【讨论】:

【参考方案15】:

在我的例子中,递归导致 React 耗尽了所有内存。

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

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

在其他 Node.js 应用程序中,这可能如下所示:

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

【讨论】:

为什么会出现这个问题? > 应该在 React 中有效,而不是使用 对吗? @Codehiker 是的,它是 React 16 中的新语法 递归是SumComponent包含一个SumComponent(其中包含一个SumComponent包含一个SumComponent...)【参考方案16】:

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

第 1 步。

set NODE_OPTIONS=--max_old_space_size=4096

第 2 步。

ng build

【讨论】:

感谢对我帮助很大,刚刚切换了我的终端 我已将它添加到文件浴/Users/MY_USER/.nvm/versions/node/v10.13.0/lib/node_modules/npm/bin/npm.cmd 它工作正常 这项在 GIT Bash 上为我工作。【参考方案17】:

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

【讨论】:

【参考方案18】:

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

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

【讨论】:

第 2 步不是强制性的。我尝试了上层解决方案,它也适用于我,无需第 2 步 好吧,你可能不需要第 2 步,我只分享了对我有用的方法 :)【参考方案19】:

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

npm install -all
npm audit fix

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

当我在 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

【讨论】:

【参考方案22】:

试试论坛上一条旧消息中指出的这个解决方案: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。

【讨论】:

您不应该更改 node_modules 中的脚本。【参考方案23】:

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


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

【讨论】:

是的,使用 16.4.2 和 Angular 11 为我修复了它。【参考方案24】:

就我而言,我通过安装 Node.js 版本 12.10.0 解决了这个问题。

【讨论】:

这里也一样。我刚刚更改了版本及其作品。 对于上下文,Node 12 有一个不同的堆管理策略,它基于可用内存而不是使用默认值。更多细节在这里:foundation.nodejs.org/announcements/2019/04/24/… 没有其他东西对我有用,就是这样。非常感谢:) @NitishKumar 我仍然收到节点 12 /shrug 的错误。接受的应该是最能解决 OP 用例的那个——尽管您希望他们此时会选择其中一个答案。 @DerekDowling Wayback 导致链接断开:web.archive.org/web/20191103115941/https://…【参考方案25】:

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

仅为您的 package.json 文件添加 "@firebase/database": "0.2.1"。重新安装 node_modules 就可以了。

【讨论】:

a Firebase 包 还是Firebase 包【参考方案26】:

我在CentOS server 7 上遇到了同样的问题,但这解决了我的问题:

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

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

【讨论】:

更改x的值后..错误保持不变 如果错误仍然存​​在,请继续增加大小,直到有足够的内存可以处理,这最终会阻止错误。我发现我无法克服此错误的唯一一次是 ng serveangular.jsonscripts 部分中引用的 massive .js 文件需要加载到内存中。 我可以设置X的值大于8192吗?我有 32GB 的内存 对我来说,在命令行上提供 max-old-space-size 不起作用。这可能是与基于 nvm 的节点的交互?相反,在 bash 脚本中,我使用了 'NODE_OPTIONS="--max-old-space-size=2048" node $NG build --prod --progress=false' ,而不是 'node --max-old -space-size=2048 $NG build --prod --progress=false' 没有。我还是不知道为什么。 如果你在 docker 中运行它并得到 KILLED 错误,请增加分配给 docker 引擎的 RAM。【参考方案27】:

对于那些从 Google 提出这个问题并希望在您的 Dockerfile 中解决此问题的人的非 Angular 通用 JavaScript 答案(将 6144 替换为您要分配的内存量(以兆字节为单位))。

我的实现在 Node.js v14.1.0 中工作,由 Docker 版本 20.10.5 执行,使用DockerOperator in airflow v2.0.1 构建 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

【讨论】:

【参考方案28】:

我在运行 angular 'ng serve' 时遇到了类似的问题:

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

就我而言,我发现我的 Angular 应用程序使用了延迟加载。一个模块已经被导入到它自己的路由模块中,但是有人也将它导入到应用程序模块中,这导致了递归(?)加载。

这会导致内存不足。

【讨论】:

【参考方案29】:

只需在终端中输入:

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

当您超过 Node.js 允许的默认最大内存时会发生错误。这样做只是增加了允许的最大内存。

【讨论】:

如果您在 shell 上工作,这就是解决方案 喜欢这样的答案?【参考方案30】:

只需运行以下命令:

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

【讨论】:

以上是关于致命错误:接近堆限制的无效标记压缩分配失败 - Ionic 3 中的 JavaScript 堆内存不足的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足 Angular 13 应用程序

致命错误:接近堆限制的无效标记压缩分配失败 - 使用 fs 处理大文件时 JavaScript 堆内存不足

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

如何修复“致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足”错误

Nuxt 生成致命错误:在堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足

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