치명적 오류 : 힙 한계에 근접한 비효율적 인 mark-compacts 할당 실패-ionic 3의 메모리가 부족한 JavaScript 힙


답변:


164

Google에서이 질문에 도달 한 사람들을위한 각도가 아닌 일반적인 답변 :

이 오류가 발생할 때마다 메모리 누수 또는 Node <= 10과 Node> 10이 메모리를 관리하는 방법의 차이 때문일 수 있습니다. 일반적으로 노드에 할당 된 메모리를 늘리는 것만으로 프로그램을 실행할 수 있지만 실제 문제를 실제로 해결하지 못할 수 있으며 노드 프로세스에서 사용하는 메모리는 할당 한 새 메모리를 초과 할 수 있습니다. 노드 프로세스가 실행되거나 노드> 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
참고로 기본값은 512MB입니다. 그 양의 10 배로 바로 이동할 필요는 없습니다. 먼저 512에서 5120 사이의 것을 시도해 볼 수 있습니다.
Cameron Hudson

메모리 문제가있는 모든 유형의 응용 프로그램에서 작동합니다.
invinciblemuffi

5
지적하고 싶을뿐입니다. 이것이 항상 메모리 누수를 나타내는 것은 아닙니다. 사용중인 라이브러리가 예전보다 약간 더 많은 메모리를 사용하고있을 수 있습니다. 우리 next.js는 빠른 새로 고침 기능으로 앱을 충돌시키기 시작했습니다.
Daniel Cooke

@DanielCooke 다음 js에 어떤 값을 사용 했습니까? 이 문제에 사용한 솔루션을 다음 js와 공유해 주시겠습니까?
MSD

@MSD 우리는 다음> 9.6으로 4096 max-old-space-size로 얻는 것 같습니다. 프로덕션 빌드 및 개발 용
Daniel Cooke

64

제 경우에는 NodeJs, 버전 12.10.0을 설치하는이 문제를 수정하십시오.


1
여기도 마찬가지입니다. 방금 버전과 작업을 변경했습니다.
brunocascio

9
컨텍스트의 경우 노드 12에는 기본값을 사용하는 대신 사용 가능한 메모리를 기반으로하는 다른 힙 관리 전략이 있습니다. 자세한 내용은 여기에서 확인하세요 : Foundation.nodejs.org/announcements/2019/04/24/…
Derek Dowling

나를 위해 다른 것은 아무것도 없었습니다. 당신이 너무 :) 감사
후세인 Alaidarous에게

우리는 노드 (12)로 업데이트 오류가 쉽게 10 노드에 힙 관리를보다 멀리 갔다
Raffaeu

1
@DerekDowling 뒤로 원인 링크가 깨진 : web.archive.org/web/20191103115941/https://...
냉혹

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의 값을 변경 한 후 .. 오류가 동일하게 유지
소하 아마드

오류가 계속되면 처리 할 메모리가 충분하여 결국 오류를 방지 할 수있을 때까지 크기를 계속 늘립니다. 나는이 오류가 번번이 수있는 유일한 시간 함께했습니다 ng serve대규모 의 .js은에서 참조 된 파일 scripts의 섹션을 angular.json메모리에로드 될 필요가있다.
atconway 2019

X의 값을 8192보다 크게 설정할 수 있습니까? 나는 RAM 32GB의이
디에고

나를 위해 명령 줄에 max-old-space-size를 제공하면 작동하지 않았습니다. 이것은 nvm 기반 노드와의 상호 작용 일 수 있습니까? 대신 bash 스크립트 내에서 'node --max-old와 반대로 작동하는'NODE_OPTIONS = "-max-old-space-size = 2048"node $ NG build --prod --progress = false '를 사용했습니다. -space-size = 2048 $ NG build --prod --progress = false '그렇지 않았습니다. 나는 아직도 이유를 모른다.
Simon H

26

포럼의 이전 메시지에서 지적 된이 솔루션을 사용해보십시오 : 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이 필요할 수 있습니다.


25

ng buildVisual Studio 코드에서 명령을 실행할 때 동일한 오류가 발생 합니다. 그러나 다음 순서로 Windows 명령 줄에서 동일한 것을 실행하면 성공적으로 빌드 할 수 있습니다.

1 단계.

set NODE_OPTIONS=--max_old_space_size=4096

2 단계.

ng build

저를 많이 도왔던 감사합니다. 제 터미널을 바꿨습니다
Gayatri Dipali

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

21
이 코드가 질문에 답할 수 있지만,이 코드가 질문에 답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
에릭 Leschinski

7

어떤 이유로 위의 모든 답변이 실제로 작동하지 않았기 때문에 문제를 해결하기 위해 다음을 수행했습니다.

  1. 먼저 node_modules폴더를 삭제해야했습니다
  2. 내 PC에 node.js를 다시 설치하고
  3. 그때 npm install

2 단계는 필수가 아닙니다. 상위 솔루션을 시도해 보았고 2 단계 없이도 효과가있었습니다
Analyst

글쎄, 당신은 2 단계가 필요하지 않을 수도 있습니다. 나는 나를 위해 일한 것만 공유했습니다. :)
sambayour

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. port--4300은 선택하는 포트에 따라 일정하지 않습니다.

  2. --max_old_space_size = 5096 너무 일정하지 않습니다. 모든 값 1024,2048,4096 등


5

제 경우에는 모든 메모리를 사용하는 반응을 일으키는 재귀 였습니다.

이것은 내가 코드를 리팩토링 할 때 발생했으며 이것을 알아 차리지 못했습니다.

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

다른 노드 앱에서는 다음과 같이 보일 수 있습니다.

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

1
이것이 왜 문제였습니까? <> </>는 <React.Fragment>를 사용하는 대신 React에서 유효해야합니다.
Joelgullander

@Codehiker 네 React 16의 새로운 구문
Rusty

4
재귀는 SumComponent포함하는 것입니다 SumComponent( SumComponent포함하는 SumComponent...)
stone

5

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

Angular 빌드 문서


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

Pls는 노드 버전을 확인합니다.

   $  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

완료되면 터미널 또는 비주얼 스튜디오를 다시 시작하십시오.

일 100 $

ionic 사용자 pls의 경우 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어떻게 구축하면 ?
Muhammed Moussa

2

각도가 아닌 또 다른 대답 (AWS Amplify에서 반응 앱을 구축하는 것과 동일한 문제에 직면했습니다).

Emmanuel이 언급했듯이 노드 v10과 노드 v12가 메모리를 처리하는 방식의 차이에서 비롯된 것 같습니다.

나는 아무 소용없이 기억력을 늘리려 고 노력했다. 그러나 노드 v12를 사용하여 수행했습니다.

Richard가 설명한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

1

나를 위해, 문제는 추가 가졌다 node_modules난에 이름이 해당 폴더 node_modules_old와 실행 npm install신선한를 생성하기를 node_modules. 어떻게 든 빌드가 여전히 node_modules_old폴더를 선택하고 있었을 것이므로 node_modules_old문제를 해결하기 위해 디렉토리 밖으로 이동 했습니다.


1

터미널에 다음을 입력하십시오.

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

1

나를 위해 구문 오류 (표시되지 않음)가 발생하여이 오류가 발생했습니다.


0

폴더 이름을 확인하십시오. 폴더 이름에 공백이 있으면 이러한 종류의 문제가 발생합니다. 공백없이 이름을 바꿉니다. 그것이 효과가 있기를 바랍니다.


0

VSCode에서 React 애플리케이션을 실행할 때 이런 일이 발생하면 propTypes를 확인하십시오. 정의되지 않은 Proptypes는 동일한 문제로 이어집니다.


0

내 angular.json 파일에 설정된 dist 폴더의 출력 경로에 대한 액세스 권한을 잃었 기 때문에이 오류가 발생했습니다. 업데이트 된 자격 증명으로 원격 경로에 다시 연결 한 후 오류가 사라졌습니다.


0

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

열심히 일했다


0

나를 위해, 나는 build모든 것을 제거한 후 내 React 프로젝트 의 디렉토리로 eslint 및 더 예쁜 수정 및 형식화를 실행할 때이 문제를 만났습니다 . 파일이 너무 많아서 그런 것 같아요.


0

이 오류에 도달하는 방법에는 여러 가지가 있다고 생각합니다!

내 편에는 package.json. 프로젝트 A에는 프로젝트 A에 대한 종속성이있는 프로젝트 B에 대한 종속성이있었습니다.


0

때로는 단순함이 성공의 열쇠입니다. 코드 while (i <= 10000) {}를 늘리지 않고 검색 i하십시오.)


0

이 문제는 내 프로젝트의 nodejs, typescript, yarn, npm 등과 같은 모든 라이브러리를 업데이트 한 후에 사라졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.