자바스크립트 가비지 컬렉션이란?
자바스크립트는 개발자가 직접 메모리를 할당하거나 해제하지 않아도 됩니다. 변수가 선언되는 시점에 엔진이 자동으로 메모리를 할당하고, 더 이상 사용되지 않는 메모리를 스스로 찾아 회수하는데, 이 과정을 바로 가비지 컬렉션(Garbage Collection)이라고 합니다.
가비지 컬렉터는 애플리케이션에서 더 이상 사용되지 않는 메모리 영역을 탐색한 뒤, 해당 공간을 자동으로 해제하여 시스템 리소스를 효율적으로 관리합니다. 이때 주로 활용되는 알고리즘이 바로 Mark-and-Sweep(마크 앤 스윕) 알고리즘입니다.
Mark-and-Sweep(마크 앤 스윕) 알고리즘
Mark-and-Sweep 알고리즘은 객체가 도달 불가능한(unreachable) 상태일 때 해당 메모리를 해제하기 위해 사용됩니다. 작동 방식은 다음과 같습니다.
- Mark(마크) 단계: 루트(root)에서 시작해 참조를 따라가며 접근 가능한(reachable) 객체들을 식별하고 표시합니다.
- Sweep(스윕) 단계: 표시되지 않은, 즉 어떤 곳에서도 참조되지 않는 객체들의 메모리를 회수합니다.
가비지 컬렉터는 이러한 방식으로 모든 객체가 도달 가능한지 여부를 판단하고, 도달 불가능한 객체들은 자동 가비지 컬렉터에 의해 처리되어 메모리에서 제거됩니다.
참조 카운팅(Reference-Counting) 가비지 컬렉션
자바스크립트에서는 참조 카운팅(Reference Counting) 방식도 가비지 컬렉션에 활용됩니다. 이 방식은 각 객체가 몇 번 참조되고 있는지를 카운트합니다.
객체를 가리키는 참조가 하나도 남아 있지 않다면, 해당 객체는 더 이상 필요 없는 것으로 판단되어 자동으로 가비지 컬렉션 대상이 되며 메모리에서 해제됩니다. 다만 이 방식은 서로를 참조하는 순환 참조(circular reference) 상황에서는 객체를 회수하지 못하는 한계가 있기 때문에, 현대 자바스크립트 엔진은 Mark-and-Sweep 방식을 기본으로 사용하고 있습니다.