JavaScript 가비지 수집에 대한 새로운 V8 업그레이드 (5.0)의 세 가지 주요 효과를 요약합니다.
Node.js의 최신 릴리스에서는 V8 JavaScript 엔진이 버전 5.0으로 업그레이드되었습니다. 새로운 ES2015 기능 중에는 가비지 수집기의 세 가지 주요 개선 사항이 포함되어 있습니다. 이러한 변화로 Orinoco라는 코드 명을 가진 V8의 새로운 가비지 컬렉터가 시작되었습니다.
V8은 구현 세대 가비지 수집기 가라는 메모리 세그먼트가 의미 - 새로운 공간 에 대한 젊은 세대 , 그리고이 오래된 공간 에 대한 구세대를 . 새 공간에 새로운 객체가 할당되고 새 공간에 두 개의 가비지 수집이 생기면 이전 공간으로 이동합니다.
# 1 : 병렬화 된 JavaScript 가비지 콜렉션
두 공간의 문제는 그 사이에 움직이는 객체가 비싸다는 것입니다. 객체를 복사해야하고 포인터를 업데이트해야합니다. 젊은 세대에서 퇴출하는 것을 대피 (evacuation )라고하며 구세대에 추가하는 것을 압축 이라고 합니다.
젊은 세대 대피와 구 세대 압축 간의 종속성이 없으므로 가비지 수집기가이를 병렬로 수행 할 수 있으므로 압축 시간이 ~ 7ms에서 평균 2ms 미만으로 75 % 단축 됩니다.
# 2 : 추적 포인터 개선
개체가 힙에서 이동되면 가비지 수집기가 모든 포인터를 업데이트해야하지만 먼저 이전 위치에 대한 포인터를 모두 찾아야합니다. 이것을 위해 V8은 기억 된 데이터 구조를 사용 하여 힙에서 흥미로운 포인터를 추적합니다. 다음 가비지 콜렉터가 실행되면 포인터가 흥미로 분류됩니다.
- 젊은 세대에서 구세대로 물체를 옮기는 것,
- 조각화 된 페이지의 오브젝트에 대한 포인터. 압축시 오브젝트가 다른 페이지로 이동할 수 있습니다.
이전 버전의 V8에서는 기억 된 세트가 저장 버퍼를 사용하여 구현됩니다 . 여기에는 들어오는 모든 포인터의 주소가 들어 있습니다. 문제는 저장소 버퍼가 포인터를 여러 번 포함하고 결국 두 저장소 버퍼가 동일한 포인터를 가질 수 있기 때문에 중복 된 항목이 발생할 수 있다는 것입니다. 이렇게하면 포인터 업데이트의 병렬 처리가 실제로 복잡해집니다.
엔터프라이즈 급 Node.js 개발에 대한 도움이 필요하십니까?
RisingStack의 전문가를 고용하십시오!
여분의 복잡성을 처리하는 대신 Orinoco는 기억 된 세트를 재구성하여 제거합니다. 앞의 접근법 대신에, 이제 각 페이지는 주어진 페이지에서 시작되는 재미있는 포인터의 오프셋을 저장합니다. 이 기술을 사용하면 포인터의 병렬 업데이트가 가능해집니다.
성능에 큰 영향을줍니다. 가비지 콜렉션 압축의 최대 일시 중지 시간을 40 %까지 줄일 수 있습니다.
# 3 : 블랙 할당
Orinoco가 도입 한 Black Allocation은 가비지 컬렉터의 마킹 단계에 관련됩니다. 이를 통해 개체가 구 세대에 할당되면 즉시 검정색으로 표시되어 해당 개체가 "실제"개체라는 의미입니다. 이 할당의 목표는 이전 공간에 할당 된 객체가 오래 유지 될 수 있으므로 다음 가비지 수집기에서 살아남 아야한다는 것입니다. 검정색의 객체는 가비지 컬렉터가 방문하지 않으며 오래된 공간의 검은 색 페이지에 놓입니다.
일반적으로 가비지 콜렉션 작업이 줄어들뿐만 아니라 마킹 진행이 빨라지므로 가비지 콜렉션 속도가 빨라집니다.
'개발 > Node.JS' 카테고리의 다른 글
Node.js의 사용 - 기업에서 노드를 사용하는 방법 (0) | 2018.03.11 |
---|---|
사례 연구 : Ghost에서 Node.js 메모리 누수 찾기 (0) | 2018.03.11 |
Node.js에서 메모리 누수 찾기 (0) | 2018.03.11 |
Node.js Internals Deep Dive - 네이티브 Node.js 모듈 작성하기 (0) | 2018.03.11 |
Node.js Internals Deep Dive - Node.js 가비지 컬렉션 설명 (0) | 2018.03.11 |