가비지 컬렉션(Garbage Collection, GC)이란, 자바스크립트 엔진이 메모리를 자동으로 관리하는 시스템으로, 프로그램이 더 이상 사용하지 않는 객체를 메모리에서 해제하는 것을 의미합니다.
GC가 메모리를 해제하는 시점은 명확히 프로그래머가 제어할 수는 없지만, 참조(references)를 기준으로 동작합니다
GC가 메모리를 해제하는 조건
GC는 특정 객체가 도달 불가능(garbage)하다고 판단될 때 해당 객체를 메모리에서 제거
루트에서 도달할 수 없는 객체는 가비지로 간주되어 메모리 해제 대상이 됩니다.
let obj = { key: "value" };
obj = null; // obj가 더 이상 참조되지 않음 → 가비지로 간주됨
위를 정리하면 다음과 같다.
- obj는 변수로, 객체({ key: "value" })를 참조하는 참조(reference)를 가지고있다.
- obj = null이 실행되면, obj에 저장된 참조(객체의 주소)가 사라지고 대신 null 값이 할당된다.
- { key: "value" } 객체는 아직 남아 있습니다.
- 하지만 참조되지 않은 상태(unreachable)가 되기 때문에 가비지 컬렉터가 이를 나중에 감지하고 메모리를 한다.
도달 가능성(Reachability)의 기준
자바스크립트의 가비지 컬렉션은 참조 그래프(reference graph)를 기반으로 동작합니다.
- 루트(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를 실행합니다.
- 메모리 부족 (Memory Pressure)
- CPU가 유휴 상태 (Idle Time)
- 특정 타이밍에서 주기적으로 실행
- 자바스크립트 엔진은 주기적으로 객체를 스캔하며 GC를 실행합니다.
- 예를 들어 V8 엔진은 두 가지 단계로 나누어 GC를 실행합니다:
- 마이너 GC(Minor GC): 짧은 수명 객체(예: 지역 변수)만 정리.
- 메이저 GC(Major GC): 오래된 객체(예: 전역 객체)까지 포함해 정리.
GC 해제 과정
마크 앤 스윕(Mark and Sweep)
- Mark (표시): 루트에서 시작하여 모든 도달 가능한 객체를 표시합니다.
- Sweep (해제): 표시되지 않은 객체를 메모리에서 제거합니다.
'Front End > Javascript' 카테고리의 다른 글
[JS] Element 함수 matches()를 이용한 이벤트 추가 (0) | 2024.03.07 |
---|---|
[JS] 상속받은 서브 클래스에서의 this에러 (0) | 2024.02.14 |
[Javascript] Object.freeze()된 객체는 변경할 수 없을까? (0) | 2023.11.10 |
[Javascript] If 조건문과 Switch 조건문의 차이 (0) | 2023.11.07 |
[Javascript] Jest 실패한 테스트만 실행시켜보자. watch 모드 기능 (0) | 2023.11.03 |