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

노드 버전은 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별도의 질문을 만든 이유 는 없습니다 .



답변

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

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

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


답변

$ 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


답변

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

node --max_old_space_size=2000  server.js 


답변

나는 그것을 발견했다 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 


답변

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

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


답변

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


답변

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

위의 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에 빌드를 수행하는 데 필요한 메모리를 제공합니다.