<aside> 💡 가비지 컬렉션의 의미에 대해 생각해보자

</aside>

(참고: https://ko.javascript.info/garbage-collection)

Garbage Collection???

우리가 컴퓨터를 사용할때 항상 메모리를 할당 할 수 밖에 없다. 그리고 우리가 가지고 있는 메모리는 무한하지 못하다. 이러한 이유로 더이상 쓰지 않는 메모리들을 정리하는 Garbage Collection(GC)과정이 필요하게 되는 것이다.

근데, 어떤 과정을 통해 해당 메모리들이 더이상 쓰지 않는 메모리 라는 것을 알 수 있는 것일까???

먼저, GC과정에 대해 알아보기 전에 "Reachability"라는 개념에 대해 알아보자. "reachable"하다는 개념은 어떻게든 접근이 가능한 값이냐?라는 의미이고, GC의 과정에서 이렇게 도달가능한 값들은 미래에 사용 될 수 있기때문에, 메모리에서 삭제되지 않는다. 결국, GC이론에서 가장 중요한 것은 어떻게 Reachable 한 것인지를 효율적으로 찾아내느냐 라는 것이다. (짧은 내 생각이다.)

GC의 방법은 크게 2가지로 나눌 수 있다.

1. Tracing(Mark-Sweep)

Mark & Sweep의 과정은 다음과 같다.

  1. 루트(태생부터 도달 가능한 값들)가 참조하는 값이나 루트가 참조하는 값이 참조(체이닝)하는 값은 도달가능!
  2. 루트에서 체이닝을 통해 루트가 참조하고 있는 모든 객체들을 방문하고 이것들을 mark(기억)한다.
  3. 도달가능한 모든 곳 들을 방문할때까지 2의 과정을 반복
  4. 3이 끝났음에도 아직 mark되지 않은 곳이 있다면, 해당 객체들은 도달 불가한 값들이므로 삭제!

위의 과정은 꽤나 합리적으로 보이지만, mark 하기위해 root로 부터 연결된 모든 객체를 순회해야 하기 때문에 시간이 오래 걸린다는 단점이 있다.

이러한 단점을 극복하기 위해서, 다음과 같은 최적화 기법이 나오게 된다.