자바스크립트 메모리 관리
자바스크립트 엔진이 변수와 객체가 사용할 메모리를 할당하고, 더 이상 필요하지 않은 메모리를 자동으로 탐지해 해제하는 과정입니다.
메모리 할당
변수나 객체를 생성하는 시점에 메모리 할당이 발생합니다. 값의 종류에 따라 저장되는 위치가 다릅니다.
- 원시 값(Primitive): 문자열, 숫자 등은 크기가 고정되어 있어 컴파일 타임에 크기를 알 수 있는 정적 데이터이며, Stack 영역에 저장됩니다.
- 객체(참조 타입): 실행 시점에 필요한 만큼 크기가 정해지는 동적 데이터이며, Heap 영역에 저장됩니다.
메모리 해제 (가비지 컬렉션)
C와 같은 저수준 언어는 malloc(), free()처럼 개발자가 직접 메모리를 할당·해제하지만, 자바스크립트는 가비지 컬렉션(GC) 을 통해 언어 차원에서 자동으로 메모리를 추적하고 더 이상 필요 없는 메모리를 해제합니다.
Reference-counting
객체가 참조되는 횟수를 추적하다가 참조 횟수가 0이 되면 메모리를 해제하는 방식입니다. 구현이 단순하지만, 서로를 참조하는 순환 참조가 발생하면 참조 카운트가 0이 되지 않아 메모리가 해제되지 않는 한계가 있습니다.
Mark-and-sweep
루트 객체에서 시작해 참조를 따라가며 도달 가능한 객체를 표시(mark)하고, 끝까지 표시되지 않은 객체를 메모리에서 청소(sweep)하는 방식으로 Reachability와 동일한 개념입니다. 순환 참조가 발생하더라도 루트에서 도달할 수 없다면 표시되지 않으므로, Reference-counting 방식의 한계를 보완할 수 있습니다.
핵심 정리
자바스크립트는 원시 값을 Stack에, 객체를 Heap에 저장하며, 가비지 컬렉션을 통해 메모리 해제를 자동으로 처리합니다. 초기 가비지 컬렉션 방식인 Reference-counting은 순환 참조를 해결하지 못했고, 이를 보완한 Mark-and-sweep이 현대 자바스크립트 엔진의 기본 GC 알고리즘으로 사용됩니다.