... V8이 서버 측 Javascript를 염두에두고 개발되지 않았기 때문에이 문제는 매우 기술적 인 이유가 있을까요? 또는 Node.js의 아키텍처와 특성과 관련된 이유가 있습니까? 스트리밍과 파이핑에 Node.js를 사용하는 것이 더 큰 양의 데이터를로드하고 처리하는 것보다는 "메모리 제한을 늘려야하기 때문에"라는 이유가 있습니까?Node.js에 1.76Gb 메모리 제한이있는 이유는 무엇입니까?
답변
현재 V8은 int 변수/필드를 사용하여 메모리 관리 하위 시스템의 다양한 제한을 추적합니다. 제한 오버 플로우는 힙 크기는 1GB의 접근 때이 이상한 동작이 발생
[...] 불행하게도이 필요 V8 소스 코드의 심각한 리팩토링
[...] 독립 문제는 GC 처리량입니다 : 동안 현재의 V8 GC 중소 힙 (특히 세대 가설을 만족시키는 응용 프로그램)에서 잘 작동합니다. 큰 힙에서는 성능이 저하 될 수 있습니다. 하나는 마크 스윕 촬영> 1 초를 기대한다 1.5GB 힙에 예를 [...] 그래서 tldr
From a chromium bugboard discussion
의 경우 : V8 큰 JS 염두에두고 코드, 가비지 수집 및 빌드되지 않았습니다 메모리 관리는 작은 웹 사이트 강화 도구를 염두에두고 작성되었습니다. 그리고 일반적으로 js는 큰 데이터를 처리하지 못했습니다.
그럼 이제 어떻게해야합니까? 메모리를 늘릴 수 있다고해도 가비지 수집은 여전히 느립니다. 몇 가지 팁 :
1) 코드가 일반적으로 동적 인 경우 평균 메모리 크기를 유지해야 가비지 수집이이를 처리 할 수 있지만 다른 한편으로는 자주 트리거하지 않아도됩니다 .
2) 그렇지 않은 경우에는 데이터 구조체를 재사용하고 자바 스크립트의 영향에서 데이터를 유지하기 위해 세계
3)를 사용하여 스트림 및 TypedArrays를 중지 할 것을 시도해야한다.
링크 된 토론은 매우 오래된 것으로, 거기에서 논의 된 제한 사항은 수년에 걸쳐 삭제되었습니다 (특정 버그는 2011 년에 "고정"으로 표시되었으며 그 이후로 추가 작업이 완료되었습니다). – jmrk
한계가있는 주된 이유는 제어 불가능한 메모리 소비자로부터 시스템의 나머지 부분을 보호하는 것입니다 (즉, 여러 프로세스가 실행 중이고 그 중 하나가 메모리를 소비 할 때 , 당신은 시스템의 다른 모든 것에 영향을주기보다는 그 한계를 뛰어 넘기를 원한다.) 이것은 브라우저 시나리오에서 특히 그렇습니다 (한 탭이 다른 모든 탭을 희생하여 모든 메모리를 소비하는 것을 원하지는 않음). 그러나 많은 서버 측 시나리오에도 적용됩니다.
제한의 기본값은 다소 차이가 있습니다. 그것은 대부분의 목적을 위해 합리적인 타협 인 것처럼 보인다. 더 필요한 것이 있으면 그것을 기꺼이 모으십시오. 최신 V8 버전의 64 비트 빌드 ("modern"= 지난 몇 년간)는 앱에 필요한 경우 매우 큰 힙을 지원합니다.
마지막 질문에 대해 "스트리밍 및 파이핑"은 Node.js 또는 다른 기술을 사용하는지 여부에 관계없이 대용량 데이터 작업에 일반적으로 유용한 기술입니다. 한 번에 모든 입력 데이터를 읽는 코드는 작성하기가 쉽지만 한계에 부딪 히기 쉽습니다. 예를 들어 , 실행중인 시스템의 실제 메모리 크기. 더 많은 메모리를 구입하여 "수정"할 수 있지만 스트리밍 및 합리적인 크기의 버퍼를 사용하는 경우 훨씬 적은 하드웨어 요구 사항으로 더 큰 입력 데이터를 처리 할 수 있으며 더 빨리 실행할 수도 있습니다.
설명 해 주셔서 감사합니다! "메모리 제한이 낮 으면 gc가 자주 트리거 될 것입니다. 메모리가 큰 경우 Gc가 세상을 오랫동안 멈출 것입니다"(위의 주석 참조) Node.js의 GC가 이벤트 루프를 실제로 차단하고 있습니까? ? 그것도 좋은 이유가 될 것입니다 ... – vuza
V8은 2011 년 말부터 "stop-the-world"GC를 가지고 있지 않습니다. GC는 메인 스레드에서 부분적으로 작업을 수행합니다 (작은 증분 단계로 작업하지 않습니다. 블록 오래), 부분적으로 백그라운드에서 실행됩니다. GC 작업의 총 비용은 할당 한 양에 비례합니다. 다시 말해, 메모리를 거의 사용하지 않는 응용 프로그램은 GC를 수행하는 데 더 적은 시간을 소비합니다. 그러나 이것은 실제로 최대 힙 크기와 관련이 없습니다. – jmrk
근원을 줄 수 있습니까? 내 지식을 업데이 트 호기심이) –
메모리 제한이 낮 으면 gc가 자주 트리거되고 메모리가 크면 메모리가 길어집니다. 하지만 shure를 사용하면 메모리 한도를 쉽게 늘릴 수 있습니다. 이것은 단지 기본값 일뿐입니다. –