치명적 오류 : CALL_AND_RETRY_LAST 할당 실패-메모리 부족 프로세스


187

노드 버전은 v0.11.13

발생 sudo top하지 않은 충돌로 인한 메모리 사용량3%

이 오류를 재현하는 코드 :

var request = require('request')
var nodedump = require('nodedump')

request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
    var data
    console.log( "Data received." );
    data = JSON.parse(res.body)
    console.log( "Data parsed."   );
    data = nodedump.dump(data)
    console.log( "Data dumped."   ); 
    console.log( data )
})

재귀 스택 크기 문제인지 확인하기 위해 --stack-size = 60000 매개 변수를 사용하여 다음 코드를 실행했습니다.

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

그리고있어

264500 
Segmentation fault

그런 다음 치명적인 오류를 발생시키는 코드를 실행했습니다 Segmentation fault.

따라서 CALL_AND_RETRY_LAST재귀 스택 크기와 공통점이 없다고 결론 을 내립니다 .

이 문제를 어떻게 해결할 수 있습니까? 내 컴퓨터에이 작업을 성공적으로 완료하기에 충분한 메모리 공간이 있다고 생각합니다.

stackoverflow에 대해 비슷한 질문이 있지만이 질문에 대해 CALL_AND_RETRY_LAST별도의 질문을 만든 이유 는 없습니다 .


3
귀하의 코드는 Node.js 0.10.28에서 잘 작동합니다. 1200MB의 가상 메모리를 사용하여 화면에 믿을 수없는 양의 정크를 인쇄했지만 "작동"하는 것 같습니다.
— 존 즈 빙크

1
쓰레기는 내가 원하는 것입니다. 나쁜 점은 노드 0.10. *가 하모니 제너레이터를 지원하지 않으므로이 목적으로 사용할 수 없다는 것입니다.
— user619271

답변:


112

소스 : github / v8 을 보면 매우 큰 객체를 예약하려고하는 것 같습니다. 내 경험에 따르면 거대한 JSON 객체를 구문 분석하려고 시도하지만 출력을 구문 분석하려고하면 발생합니다. JSON과 node0.11.13은 잘 작동합니다.

더 필요하지 않고 --stack-size더 많은 메모리가 필요합니다 : --max_new_space_size및 / 또는 --max_old_space_size.

그 외에도 다른 JSON 파서를 시도하거나 입력 형식을 JSON 대신 JSON 행으로 변경하려고합니다.


10
대단히 감사합니다! --max_old_space_size = 2000000을 정의하면 ~ 2GB가 문제를 해결했습니다. 다양한 --max_new_space_size는 전혀 영향을 미치지 않는 것 같습니다.
— user619271

또한 v8 소스를 살펴 보았지만 거기에서 무슨 일이 일어나고 있는지 전혀 이해하지 못했습니다. 그래서 당신의 도움없이 이것을 해결할 수있는 기회는 아마도 0이 될 것입니다. 다시 한 번 감사드립니다.
— user619271

1
@ theWanderer4865 "입력 형식을 JSON 대신 JSON 행으로 변경해보십시오"는 무엇을 의미합니까? 좀 더 자세히 설명해 주시겠습니까? 감사합니다.
— titusmagnus

16
@ user619271 --max_old_space_size = 2048은 2GB입니다.
— Timeless

1
Haha .. @Timeless
— technophyle

51
$ sudo npm i -g increase-memory-limit

프로젝트의 루트 위치에서 실행하십시오.

$ increase-memory-limit

이 도구는 node_modules / .bin / * 파일 내의 모든 노드 호출에서 --max-old-space-size = 4096을 추가합니다.


Node.js 버전> = 8-감가 상각 통지

NodeJs V8.0.0부터는 옵션을 사용할 수 있습니다 --max-old-space-size. NODE_OPTIONS = 옵션 ...

$ export NODE_OPTIONS=--max_old_space_size=4096

안녕하세요 @ sol-ibit입니다. 4096의 주장은 무엇을 의미합니까?
— estebanpdl

1
안녕하세요 @estebanpdl, 메모리를 늘려 Node.js 앱을 실행하는 솔루션은 추가 V8 플래그 (--max-old-space-size)로 프로세스를 시작하는 것입니다. 원하는 메모리 크기 (MB)를 추가해야합니다. 다음 명령은 4GB의 메모리 제한으로 응용 프로그램을 시작합니다.
— sol404

1
변수를 설정하면 export NODE_OPTIONS=--max_old_space_size=4096나에게 속임수가되었습니다! 감사!
— Tarator

46

이 문제를 해결하려면 옵션을 사용하여 메모리 제한을 늘려서 응용 프로그램을 실행해야합니다 --max_old_space_size. 기본적으로 Node.js의 메모리 제한은 512MB입니다.

node --max_old_space_size=2000  server.js 

5
이 작업을 수행하는 방법에 대한 단계별 가이드가 있습니까? 이 충실한 코드를 어디에 붙여 넣습니까? node --max_old_space_size=2000 server.js
— Mr. Benedict

@ Mr.Benedict 응용 프로그램을 시작할 때이 작업을 수행합니다.
— easymoden00b

2
node --max_old_space_size = 2048 server.js ... 더 적합합니다 ... 작동합니다
— danday74

1
Google 클라우드에 React 앱이 있습니다. 어떻게해야합니까? 누구든지 안내해 주시겠습니까?
— Shubham Kushwah

1
@ easymoden00b node server.js오히려 아니다 npm start. 어떻게해야합니까?
— Shubham Kushwah

30

나는 그것을 발견했다 max_new_space_size 노드 4.1.1에서 옵션을 선택하지 않습니다 및 max_old_space_size내 문제를 해결할 수 없습니다 만. 나는 내 shebang에 다음을 추가하고 있으며 이들의 조합은 효과가있는 것 같습니다.

#!/usr/bin/env node --max_old_space_size=4096 --optimize_for_size --max_executable_size=4096 --stack_size=4096

[편집] : 4096 === 4GB 메모리, 장치의 메모리가 부족하면 더 적은 양을 선택하십시오.

[업데이트] : 이전에 실행되었던 grunt를 실행하는 동안이 오류가 발견되었습니다.

./node_modules/.bin/grunt

명령을 다음으로 업데이트 한 후 메모리 오류가 발생하지 않았습니다.

node --max_old_space_size=2048 ./node_modules/.bin/grunt 

4
--max_old_space_size = 8192 추가했는데 여전히 문제를 해결하지 못했지만 내 PC가 정지되었습니다. (
— Dhyey

피드백 덕분에 예제의 메모리 양을 8Gb에서 4Gb로 줄였습니다.
— jfunk

28

참고 : 이것이 전자 응용 프로그램에 미치는 영향에 대한 의견의 경고를 참조하십시오.

2017 년 8 월에 출시 된 v8.0부터 NODE_OPTIONS 환경 변수는이 구성을 노출합니다 ( NODE_OPTIONS는 8.x에 착륙했습니다! 참조 ). 기사 에 따라 소스에 허용 된 옵션 (참고 : 최신 링크는 아님) 만 허용되며 여기에는 다음이 포함됩니다."--max_old_space_size" 합니다. 이 기사의 제목은 약간 오해의 소지가 있습니다. NODE_OPTIONS가 이미 존재하는 것 같지만이 옵션이 노출되었는지는 확실하지 않습니다.

그래서 나는 내 안에 넣었다 .bashrc.
export NODE_OPTIONS=--max_old_space_size=4096


경고 : Windows 시스템에서이 변수를 환경 변수로 설정하지 마십시오. 모든 것을 망 칩니다 . GitKraken, Slack, VS2017 설치 프로그램 (크롬 기반), Azure 관련 VS2017 확장 및 VS2017의 "Extensions and Updates"메뉴 항목까지 손상되었습니다.
— 로마 Starkov

github.com/electron/electron/issues/12695를 살펴보십시오 -2.0.3의 Electron이 NODE_OPTIONS에서 충돌하지 않는 것처럼 보입니다. 그러나이 문제를 피하기 위해 특정 프로젝트 디렉토리에서만 smartcd를 사용하여 NODE_OPTIONS를 설정했습니다 .github.com / cxreg / smartcd
— 벤 Creasy

아, 아마도 Discord와 VS Code가 영향을받지 않은 이유를 설명 할 것입니다.
— Roman Starkov

1
Windows 컴퓨터에서 어떻게합니까?
— Mahmoud Ezzat

16

increase-memory-limit모듈은 이제 더 이상 사용되지 않습니다. 현재 Node.js를의 V8.0 2017년 8월 제공, 우리는 이제 사용할 수 있습니다 NODE_OPTIONS세트에 ENV 변수를 max_old_space_size전 세계적으로.

export NODE_OPTIONS=--max_old_space_size=4096

참조 URL : https://github.com/endel/increase-memory-limit


이것을 어디에 설정합니까? 나는 푸른 개발 운영 빌드를 사용하고 창문 에이전트에 실패 빌드
— INT-I

플랫폼 간 차이를 피하려면 cross-env모듈을 전역 적으로 설치 하고 다음 명령으로 터미널에서 실행하십시오.cross-env PORT=8000 node --max-old-space-size=4096 server.js
— Ali David

Azure Devops 빌드는 클라우드의 MS 에이전트에서 실행되며 실행할 콘솔이 없습니다. powershell을 사용하여 이것을 달성하는 다른 방법을 찾았습니다. 여기에 답변으로 추가했습니다.
— int-i

13

위의 답변에 대한 변형입니다.

위의 straight up node 명령을 성공적으로 시도했지만 이 Angular CLI 문제 의 제안 이 저에게 효과적이었습니다.package.json 효과적이었습니다. 프로덕션 빌드를 실행할 때 Node에서 사용 가능한 메모리를 늘리기 파일에 하십시오.

따라서 노드에서 사용 가능한 메모리를 4gb ( max-old-space-size=4096) 로 늘리 려면 노드 명령은입니다 node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod. (필요에 따라 메모리 양을 늘리거나 줄이십시오-4gb가 나를 위해 일했지만 더 많거나 적게 필요할 수 있습니다). 그런 다음 package.json 'scripts'섹션에 다음과 같이 추가하십시오.

"prod": "node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build --prod"

사용 가능한 다른 스크립트와 함께 스크립트 개체에 포함됩니다. 예 :

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "prod": "node --max-old-space-size=4096./node_modules/@angular/cli/bin/ng build --prod"
}

그리고 당신은 전화로 실행합니다 npm run prod(당신은 실행해야 할 수도 있습니다sudo npm run prod 합니다 (Mac 또는 Linux 인 경우 ).

Node에 더 많은 메모리가 필요하게하는 근본적인 문제가있을 수 있습니다.이 경우에는 해결하지 않지만 최소한 Node에 빌드를 수행하는 데 필요한 메모리를 제공합니다.


6

내 작업 솔루션은 다음과 같습니다

  • 설치 크로스 ENV
    npm install --save-dev cross-env 또는 npm install -g cross-env.
  • 파일 package.json추가 새 빌드 스크립트의
    예
    ... "build:prod:ios": "cross-env NODE_OPTIONS='--max-old-space-size=8192' ionic cordova build ios --prod --release" ...
  • 다음에이 명령을 사용하여 빌드하십시오.
    npm run build:prod:ios

  • 문제 해결됨.


1

나는이 문제로 며칠을 잃었습니다 .... 어떤 파일에서 하나의 정적 파일 인 빌드 파일을 가져 오는 것을 알 때까지. 빌드가 끝나지 않도록합니다. 다음과 같은 것 :

import PropTypes from "../static/build/prop-types"; 

실제 소스로 수정하면 모든 문제가 해결되었습니다.

내 솔루션 공유 :)


2
솔루션을 조금 더 설명해 주시겠습니까? 이 같은 문제가 발생하여 응용 프로그램이 충돌합니다. 앱이 실행되는 처음 몇 분 동안 모든 것이 잘 작동하지만 결국 메모리 부족으로 인해 충돌이 발생합니다. 그러나 그 기간 동안 Sequelize는 잘 작동합니다.
— Porlune

1
내 IDE (WebStorm)가 자동으로 소스에 빌드 js를 포함 시켰습니다. 하나의 파일 (내 소스)이 변경되면 모든 파일을 새로운 js 출력으로 빌드합니다. 그러나 내 소스에 빌드 파일에 대한 참조가 있으면 빌드가 중단되지 않습니다. 어떤 파일에 잘못된 파일이 포함되어 있는지 확인하십시오.
— Tiago Gouvêa

1

반응 네이티브 번들을 만들 때이 문제가 발생했습니다. 내가 시도하고 작동하지 않은 것들 :

  1. 을 늘리면 node --max_old_space_size, 이것은 당연히 로컬에서 작동했지만 jenkins에서는 실패했지만 여전히 jenkins에 어떤 문제가 있는지 잘 모르겠습니다.
  2. 노드의 버전을 6.9.1로 다운 그레이드하기 위해 언급 한 곳이 나에게도 효과가 없었습니다. 나는 이것이 당신에게 효과가있을 수 있으므로 여기에 넣고 싶습니다.

나를 위해 일한 것 : 코드에서 정말 큰 파일을 가져오고있었습니다. 내가 해결 한 방법 ignore은 .babelrc다음과 같이 목록에 포함시키는 것입니다 .

{
    "presets": ["react-native"],
    "plugins": ["transform-inline-environment-variables"],
    "ignore": ["*.json","filepathToIgnore.ext"]
}

그것은 .js실제로 파일을 변환 할 필요가 없었고 무시 목록에 추가하는 것이 도움 이되는 파일 이었습니다 .


1

이 오류는 실행에 할당 된 필수 메모리가 프로세스 실행에 필요한 메모리보다 적은 경우에 발생합니다. 기본적으로 노드 메모리 크기는 512MB이며이를 늘리려면 다음 명령을 입력해야합니다.

node --max-old-space-size= <NewSize> <fileName>

1
여기서 파일 이름은 무엇입니까?
— Rashedul.Rubel

1

나는 이온 에서이 문제에 직면하고 많은 솔루션을 시도했지만 이것을 실행하여 해결했습니다.

MAC의 경우 : node --max-old-space-size = 4096 / usr / local / bin / ionic cordova build android --prod

Windows의 경우 : node --max-old-space-size = 4096 / Users / {your user} / AppData / Roaming / npm / node_modules / ionic / bin / ionic cordova build windows --prod


1
npm install -g increase-memory-limit

메모리 제한 증가

또는

  1. % appdata %-> npm 폴더로 이동하거나 C:\Users\{user_name}\AppData\Roaming\npm
  2. 선호하는 편집기에서 ng.cmd를 엽니 다.
  3. 추가 --max_old_space_size=8192받는 사람 IF및 ELSE블록

이제 변경 후 ng.cmd 파일은 다음과 같습니다.

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)

1

Windows 컴퓨터에서 아래 명령을 실행하십시오.

NODE_OPTIONS =-max_old_space_size = 4096 설정



0

Azure 빌드 파이프 라인에서이 오류가 발생하면 아래 단계를 수행하여 빌드 에이전트의 환경 변수를 변경하십시오.

아래 설정으로 컴파일하기 전에 Azure build pipeline task-> 추가Azure powershell script:Inlinescript

- task: AzurePowerShell@3
  displayName: 'Azure PowerShell script: InlineScript'
  inputs:
    azureSubscription: 'NYCSCA Azure Dev/Test (ea91a274-55c6-461c-a11d-758ef02c2698)'
    ScriptType: InlineScript
    Inline: '[Environment]::SetEnvironmentVariable("NODE_OPTIONS", "--max_old_space_size=16384", "Machine")'
    FailOnStandardError: true
    azurePowerShellVersion: LatestVersion

0

ionic-app-scripts.js dint 작업에서 #! / usr / bin / env 노드 --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"% *)

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