광고


[Node.js] V8 Garbage Collection Improvements (번역) Node.js


0. 들어가기에 앞서

최근 Node.js의 Garbage collection 관련된 글을 2개 번역하였다.
이 글은 그 마무리 글로써, ES2015에서 V8 엔진의 Garbage collection이 어떻게 개선되었는지에 대한 글이다.
가급적, 이 글을 읽기 전에 위의 2개의 글을 읽어보는 것을 추천한다.

원문 링크는 다음과 같다 : Javascript Garbage Collection Improvement - Orinoco


1. 서문

이 글은 V8 엔진이 5.0으로 업그레이드 되면서, 자바스크립트 Garbage collection에 생긴 주된 3가지 변화에 대해 정리하는 글이다.

이 변화들은 V8 엔진의 새로운 Garbage collector를 이끌어 냈으며, 코드 네임을 Orinoco라고 붙였다.
V8 엔진은 Generational Garbage collector를 구현했으며, 이는 다음과 같이 메모리 영역을 두가지 세그먼트로 분리함을 의미한다.
  • New space : Young generation
  • Old space : Old generation

새로이 할당된 오브젝트는(1~8MB 사이의) New space에 저장되며, New space에서 두번의 Scavenge Garbage collection에서 살아 남으면, Old space로 승격(이동)된다.


2. Parallelised Javascript Garbage Collection

두 개의 space 개념은 그 사이에서 오브젝트를 이동시킬 때의 비용이 비싸다는 것이다.
오브젝트를 복사해야 하고, 관련된 포인터들을 모두 업데이트 시켜 줘야 한다.

Young 세대에서 빠져 나오는 것을 evacuation이라고 하며, 
빠져나온 오브젝트를 old 세대에 추가하는 것을 compaction이라고 한다.

Young 세대의 evacuation과 old 세대의 compaction 사이에는 아무런 연관 관계가 없기 때문에, Garbage collector는 이를 병렬적으로 수행할 수 있다.
이를 병렬적으로 수행함으로써, compaction 시간이 7 -> 2ms 미만으로 평균 75%정도 단축되었다.



3. Track(Tagged) Pointers Improvements

오브젝트가 힙에서 이동될 때, Garbage collector는 모든 포인터를 업데이트 해 주어야만 한다.
그러나 먼저, 이전 위치에 대한 모든 포인터를 찾아야 한다.
이를 위해, V8 엔진은 "remembered set"라 불리우는 데이터 구조를 사용하여, 힙에서 관심(interesting)포인터들을 추척한다.

다음에 Garbage collector가 실행되어 오브젝트를 이동시키면, 포인터가 관심있는 녀석으로 분류된다.
  • young 세대에서 old 세대로 오브젝트를 옮길 때
  • 조각난 pages에 있는 오브젝트의 포인터라서, compaction 과정에서 다른 page로 이동될 수도 있다.

이전 버전의 V8 엔진에서는 "remembered set"이 stored buffer를 이용하여 구현하였다.
여기에는 들어오는(incoming) 오브젝트들에 대한 모든 포인터의 주소 정보가 포함되어 있다.
문제는 stored buffer가 포인터를 여러 번 포함할 수 있고 결국 두 stored buffer가 동일한 포인터를 가질 수 있으므로, 항목이 중복될 수 있다는 것이다.
이렇게 되면, 포인터 업데이트의 병렬화가 실제로 복잡해 진다.

추가적인 복잡도를 처리하는 대신, Orinoco는 "remembered set"를 재구성하여 복잡도를 발생시킬 수 있는 여지를 제거시켜 버렸다. 
앞의 접근법 대신에, 각 page는 주어진 page로부터 관심있는 포인터들의 오프셋을 저장한다.
이 방식을 사용하여 포인터의 병렬 업데이트가 가능해진 것이다.


4. Black Allocation

Orinoco가 도입한 black allocation은 Garbage collector의 marking 단계에 포함된다.
이를 통해 오브젝트가 old 세대에 할당되면, 그 즉시 검은색으로 marking하는데 이는 해당 오브젝트가 "살아있다"는 의미이다.

이 할당 방식의 목표는 Old space에 할당된 오브젝트는 더 오래 살아있기 때문에, 다음 Garbage collecting에서 살아 남아야 한다는 것이다.
검은색으로 marking된 오브젝트들은 Garbage collecting의 대상이 아니며, Old space의 black pages에 위치하게 된다.

빠른 marking 진행과 Garbage collecting 대상이 줄어들기에, 전반적으로 Garbage collecting이 빨라지게 된 것이다.

V8 엔진의 업데이트에 대해 추가 정보를 얻고 싶다면, V8 project's blog를 방문해 보길 바란다.


1 2 3 4 5 6 7 8 9 10 다음