Garbage Collection

Garbage Collection #

쓰레기 수집. 이때 쓰레기는 Heap영역에서 더 이상 사용하지 못하는 메모리를 의미하며, 이 부분들을 수집해 해제하는 역할을 Garbage Collection이라고 한다.

이하 Garbage Collection은 GC로 표현한다.

GC는 일반적으로 다음 과정으로 동작한다.

  • GC 수행하는 스레드를 제외하고 모두 Stop the world
  • 참조할 수 없는 객체에 대한 메모리 해제
  • GC 종료 및 스레드 작업 재개

Tricolor 알고리즘 #

많은 언어에서 Tricolor 알고리즘을 사용해 가비지 컬렉팅을 한다. Go 언어에서 이 알고리즘 명칭은 Tricolor Mark-and-Sweep 알고리즘이다. Tricolor라는 뜻은, 삼색 이라는 뜻으로, 힙에 있는 오브젝트를 세 가지 색으로 나누기 때문에 붙은 이름이다. 검은색, 흰색, 회색으로 오브젝트를 구분하며, 다음과 같은 의미를 갖는다.

  • 검은색: 흰색에 있는 오브젝트를 가리키는 포인터가 확실히 없는 오브젝트
  • 흰색: 검은색 오브젝트를 가리킬 수도 있는 오브젝트
  • 회색: 흰색 오브젝트 중 일부를 가리킬 수 있는 오브젝트

우선 가비지 컬렉터는 모든 오브젝트를 흰색으로 두고 시작한다. 각 색은 집합 안에 담겨서 관리된다. 그리고 다음 알고리즘을 따라 흰색을 추려나간다.

  1. 루트 오브젝트를 모두 회색 집합에 넣는다.
  2. 회색 집합의 오브젝트들을 검은색 오브젝트로 바꾸고, 흰색 오브젝트를 가리키고 있는 포인터가 있는지 확인한다.
  3. 흰색 오브젝트를 가리키는 포인터가 하나라도 있다면, 해당 흰색 오브젝트를 회색 집합에 넣는다.
  4. 2번과 3번 과정을 회색 집합에 아무 것도 남지 않을 때까지 반복한다.
  5. 흰색 오브젝트가 가비지 컬렉션된다.
루트 오브젝트
스택에 있는 오브젝트, 또는 전역 변수와 같이 앱에서 직접 접근하는 오브젝트를 말한다.
이 작업이 진행되는 스레드를 뮤테이터(mutator) 스레드라고 한다. 뮤테이터는 힙에 있는 오브젝트의 포인터가 변경될 때마다 write barrier라는 함수를 실행한다. 오브젝트의 포인터가 변경되었다는 것은, 그 오브젝트에 접근이 가능하다는 것을 의미한다. 따라서 write barrier는 이 오브젝트를 회색 집합에 넣는다.

Mark and Sweep 알고리즘 #

기본적인 아이디어는, Stop the world 이후, 힙에 접근할 수 있는 오브젝트를 모두 검은색으로 바꾼다. 그 이후, 더 이상 확인해야 하는 회색 오브젝트가 없으면 Sweep 단계로 간다. Mark and Sweep 알고리즘은 GC를 구현한 알고리즘 중 간단하다는 장점이 있다. 그러나, Stop the world 방식이므로, 프로그램 실행을 중단해야 하는 문제가 있다.

… 작성 중