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