STUDY/Javascript

가비지 컬렉션 (Garbage Collection) 이란?

_JJ_ 2023. 4. 18. 20:43

가비지 컬렉션 (Garbage Collection, GC)

자바스크립트는 눈에 보이지 않는 곳에서 메모리 관리를 수행한다. 원시값, 객체, 함수 등 우리가 만드는 모든 것은 메모리를 차지한다. 개발을 하다 보면 유효하지 않는 메모리인 가비지(Garbage)가 발생하는데 이와 같이 필요 없게 된 메모리를 주기적으로 삭제하는 프로세스를 말한다. 가비지 컬렉터는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제한다.

가비지 컬렉션은 엔진이 자동으로 수행하므로 개발자는 이를 억지로 실행하거나 막을 수는 없다.

 

자바스크립트는 도달 가능성(reachability)라는 개념을 사용해 메모리 관리를 수행한다. 도달 가능한 값은 어떻게든 접근, 사용이 가능한 값을 의미한다. 도달 가능성이 있는 값은 삭제되지 않는다. 이런 값을 루트(root)라고 부른다.

ex)

  • 현재 함수의 지역 변수와 매개변수
  • 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
  • 전역변수
  • 기타 등등

루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 된다.

그러나 참조된다고 해서 도달 가능한 것은 아니다. 객체들이 연결되어 섬 같은 구조를 만드는데, 이 섬에 도달할 방법이 없는 경우 섬을 구성하는 객체 전부가 메모리에서 삭제된다.

 

내부 알고리즘

'mark-and-sweep'이라고 불리는 가비지 컬렉션 기본 알고리즘에 대해 알아보자. 가비지 컬렉션은 대개 다음 단계를 거쳐 수행된다.

 

  1. 가비지 컬렉터는 루트(root)정보를 수집, 이를 기억(mark)한다.
  2. 루트가 참조하는 모든 객체를 방문하고 mark 한다
  3. mark 된 모든 객체에 방문하고, 그 객체들이 참조하는 객체도 mark 한다. 한번 방문한 객체는 다시 방문하는 일은 없다.
  4. 루트에서 도달 가능한 모든 객체를 방문할 때까지 반복한다.
  5. mark 되지 않은 모든 객체를 메모리에서 삭제한다.

 

최적화 기법

generational collection (세대별 수집)

객체를 새로운 객체와 오래된 객체로 나눈다. 상당 수의 객체는 생성 이후 역할을 빠르게 수행해 금방 쓸모없어지는데, 가비지 컬렉터는 이런 객체를 새로운 객체로 구분하고 공격적으로 메모리에서 제거한다. 일정 시간 동안 살아남은 객체는 오래된 객체로 구분하고 덜 감시한다.

 

increamental collection (점진적 수집)

방문해야 할 객체가 많은 경우, 그만큼 시간이 걸리고 리소스가 소모되어 자바스크립트 엔진은 가비지 컬렉션을 여러 부분으로 분리한 다음 각 부분을 별도로 수행한다.

 

idle-time collection (유휴 시간 수집)

가비지 컬렉터는 실행에 주는 영향을 최소화하기 위해 CPU가 유휴 상태일 때만 가비지 컬렉션을 실행한다.

 

 

 

 

 

reference

https://ko.javascript.info/garbage-collection