Garbage Collection #
쓰레기 수집. 이때 쓰레기는 Heap영역에서 더 이상 사용하지 못하는 메모리를 의미하며, 이 부분들을 수집해 해제하는 역할을 Garbage Collection이라고 한다.
이하 Garbage Collection은 GC로 표현한다.
GC는 일반적으로 다음 과정으로 동작한다.
- GC 수행하는 스레드를 제외하고 모두 Stop the world
- 참조할 수 없는 객체에 대한 메모리 해제
- GC 종료 및 스레드 작업 재개
Tricolor 알고리즘 #
많은 언어에서 Tricolor 알고리즘을 사용해 가비지 컬렉팅을 한다. Go 언어에서 이 알고리즘 명칭은 Tricolor Mark-and-Sweep 알고리즘이다. Tricolor라는 뜻은, 삼색 이라는 뜻으로, 힙에 있는 오브젝트를 세 가지 색으로 나누기 때문에 붙은 이름이다. 검은색, 흰색, 회색으로 오브젝트를 구분하며, 다음과 같은 의미를 갖는다.
- 검은색: 흰색에 있는 오브젝트를 가리키는 포인터가 확실히 없는 오브젝트
- 흰색: 검은색 오브젝트를 가리킬 수도 있는 오브젝트
- 회색: 흰색 오브젝트 중 일부를 가리킬 수 있는 오브젝트
우선 가비지 컬렉터는 모든 오브젝트를 흰색으로 두고 시작한다. 각 색은 집합 안에 담겨서 관리된다. 그리고 다음 알고리즘을 따라 흰색을 추려나간다.
- 루트 오브젝트를 모두 회색 집합에 넣는다.
- 회색 집합의 오브젝트들을 검은색 오브젝트로 바꾸고, 흰색 오브젝트를 가리키고 있는 포인터가 있는지 확인한다.
- 흰색 오브젝트를 가리키는 포인터가 하나라도 있다면, 해당 흰색 오브젝트를 회색 집합에 넣는다.
- 2번과 3번 과정을 회색 집합에 아무 것도 남지 않을 때까지 반복한다.
- 흰색 오브젝트가 가비지 컬렉션된다.
루트 오브젝트
스택에 있는 오브젝트, 또는 전역 변수와 같이 앱에서 직접 접근하는 오브젝트를 말한다.
이 작업이 진행되는 스레드를 뮤테이터(mutator) 스레드라고 한다. 뮤테이터는 힙에 있는 오브젝트의 포인터가 변경될 때마다write barrier
라는 함수를 실행한다. 오브젝트의 포인터가 변경되었다는 것은, 그 오브젝트에 접근이 가능하다는 것을 의미한다. 따라서write barrier
는 이 오브젝트를 회색 집합에 넣는다.
Mark and Sweep 알고리즘 #
기본적인 아이디어는, Stop the world 이후, 힙에 접근할 수 있는 오브젝트를 모두 검은색으로 바꾼다. 그 이후, 더 이상 확인해야 하는 회색 오브젝트가 없으면 Sweep 단계로 간다. Mark and Sweep
알고리즘은 GC를 구현한 알고리즘 중 간단하다는 장점이 있다. 그러나, Stop the world 방식이므로, 프로그램 실행을 중단해야 하는 문제가 있다.
… 작성 중