繁体   English   中英

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

[英]FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory in Ionic 3

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

致命错误的屏幕截图:堆限制附近的无效标记压缩分配失败 - JavaScript

对于那些从谷歌登陆这个问题的人的非角度一般答案:

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

我有内存泄漏。 这是一篇关于在 node.js 中调试内存泄漏的好文章

也就是说,要增加内存,请在运行 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.

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

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

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

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

只需在终端中输入:

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

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

尝试在论坛上的旧消息中指出的此解决方案: https : //forum.ionicframework.com/t/3-7-0-ios-build-with-prod-not-working/107061/24

打开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。

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

第1步。

set NODE_OPTIONS=--max_old_space_size=4096

第2步。

ng build

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

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

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

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

在其他节点应用程序中,这可能如下所示:

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

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


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

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

  1. 我必须先删除node_modules文件夹
  2. 在我的 PC 上重新安装 node.js 和
  3. 然后npm install
node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --baseHref=/baseUrl/ --prod=true

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

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

更新:

我不知道为什么只添加 --build-optimizer 解决了这个问题,但根据角度文档,它应该在启用 aot 的情况下使用,所以更新的命令应该如下所示

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

角度构建文档

更换线路

"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 等

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

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

我没有使用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

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

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

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

并运行项目这个命令:

npm run serve

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

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

我删除了现有的节点模块并运行以下命令来解决我的问题

npm install -all
npm audit fix

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

请检查您的节点版本:

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

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

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

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

正如 Emmanuel 所提到的,它似乎来自节点 v10 与节点 v12 处理内存方式的不同。

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

检查如何将nvm use $VERSION_NODE_12添加到您的构建设置中,如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

只需运行此命令:

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

对于那些从谷歌登陆这个问题并希望在你的Dockerfile修复这个问题的非 Angular 通用 JavaScript 答案(用你想要分配的内存量(以兆字节为单位)替换6144 )。

我的实现是在 Node.js v14.1.0 中工作,由 Docker 版本 20.10.5 执行,使用DockerOperator气流 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

视窗

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

mceclip0.png

或者这可以在 powershell 中完成:

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

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

Linux/macOS

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

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

如果您在 Windows 上开发并在发布时遇到此问题,请通过官方站点升级 Node.js: https : //nodejs.org/en/download/

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

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

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

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

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

#!/usr/bin/env node --max-old-space-size=4096 in the ionic-app-scripts.js dint work

修改

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" %* )

辛苦了

对我来说,在我的 React 项目中运行 eslint 和 prettier fix 并使用build目录进行格式化时,我遇到了这个问题,删除它后一切正常。 我猜这是因为文件太多。

当我使用ionic serve命令运行ionic 3项目时,出现此错误:

致命错误的屏幕快照:堆限制分配附近的无效标记压缩无效-Javascript

当我使用ionic serve命令运行ionic 3项目时,出现此错误:

致命错误的屏幕快照:堆限制分配附近的无效标记压缩无效-Javascript

当我使用ionic serve命令运行ionic 3项目时,出现此错误:

致命错误的屏幕快照:堆限制分配附近的无效标记压缩无效-Javascript

我正在使用 Node v-14.17 的最新稳定版本。 我在使用新的 Angular Ionic Projects 时遇到了同样的问题,并尝试了上面的大部分答案但没有成功。

最后升级到 16.4.2 LTS 后修复了这个问题。

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

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

我有:

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

运行此命令:

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. export NODE_OPTIONS="--max-old-space-size=6144" #它将增加到6gb。

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

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

解决了!!! (对于 Angular)经过数小时尝试解决此问题后,我终于确定,尽管尝试增加max_old_space_size ,但仍然出现该错误的原因是因为我在 64 位计算机上安装了 x86(32 位)版本的 Node.js。

看到这个后,我:

  1. C:\\ProgramData\\chocolatey\\bin删除chocolatey
  2. 卸载了node.js上的x86 (32bit)版本
  3. C:\\Users\\%username%\\AppData\\Roaming中删除了npmnpm cache文件夹
  4. 重新启动了我的电脑
  5. 安装了x64版本的node
  6. 重新安装 angular/cli npm install -g @angular/cli
  7. 完成了我的项目,一切正常,没有任何错误

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

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

如果这对某人有用。 确保我们的 Sass 中没有递归。 或您最近添加的代码中的非退出递归。 在某些情况下,超出最大堆就是一个标志。

当我使用“ ionic serve”命令运行ionic 3项目时,出现此错误:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM