가비지 컬렉션 정리

가비지 컬렉션(Garbage Collection, GC)이란, 자바스크립트 엔진이 메모리를 자동으로 관리하는 시스템으로, 프로그램이 더 이상 사용하지 않는 객체를 메모리에서 해제하는 것을 의미합니다.

GC가 메모리를 해제하는 시점은 명확히 프로그래머가 제어할 수는 없지만, 참조(references)를 기준으로 동작합니다

GC가 메모리를 해제하는 조건

GC는 특정 객체가 도달 불가능(garbage)하다고 판단될 때 해당 객체를 메모리에서 제거

루트에서 도달할 수 없는 객체는 가비지로 간주되어 메모리 해제 대상이 됩니다.

let obj = { key: "value" };
obj = null; // obj가 더 이상 참조되지 않음 → 가비지로 간주됨

위를 정리하면 다음과 같다.

  1. obj는 변수로, 객체({ key: "value" })를 참조하는 참조(reference)를 가지고있다.
  2. obj = null이 실행되면, obj에 저장된 참조(객체의 주소)가 사라지고 대신 null 값이 할당된다.
  3. { key: "value" } 객체는 아직 남아 있습니다.
  4. 하지만 참조되지 않은 상태(unreachable)가 되기 때문에 가비지 컬렉터가 이를 나중에 감지하고 메모리를 한다.

도달 가능성(Reachability)의 기준

자바스크립트의 가비지 컬렉션은 참조 그래프(reference graph)를 기반으로 동작합니다.

  1. 루트(Root)
    • 실행 중인 함수의 지역 변수와 매개변수.
    • 전역 객체(window 또는 global).
    • 클로저에 의해 유지되는 변수.

루트에서 참조 가능한 객체는 도달 가능하다고 판단됩니다.

let obj1 = { key: "value" };
let obj2 = { key: obj1 };

// A 메모리: { key: "value" } 
Root --> obj2(도달가능) --> obj1(도달가능)
obj2 = null; // gc이전 A 메모리: { key: "value" } 
Root --> obj2(null) --> obj1(도달 불가능)

// gc이후 A 메모리는 해제됨

GC가 메모리를 해제하는 시점

자바스크립트 엔진이 내부적으로 판단하여 아래 상황에서 GC를 실행합니다.

  1. 메모리 부족 (Memory Pressure)
  2. CPU가 유휴 상태 (Idle Time)
  3. 특정 타이밍에서 주기적으로 실행
    • 자바스크립트 엔진은 주기적으로 객체를 스캔하며 GC를 실행합니다.
    • 예를 들어 V8 엔진은 두 가지 단계로 나누어 GC를 실행합니다:
      1. 마이너 GC(Minor GC): 짧은 수명 객체(예: 지역 변수)만 정리.
      2. 메이저 GC(Major GC): 오래된 객체(예: 전역 객체)까지 포함해 정리.

GC 해제 과정

마크 앤 스윕(Mark and Sweep)

  • Mark (표시): 루트에서 시작하여 모든 도달 가능한 객체를 표시합니다.
  • Sweep (해제): 표시되지 않은 객체를 메모리에서 제거합니다.