자바스크립트 - 자동 메모리 관리 언어로, 개발자는 직접 메모리 해제를 관리하지 않아도 된다.
자바스크립트 엔진은 Garbage Collection (GC)을 통해 더 이상 사용되지 않는 메모리를 자동으로 회수하고 정리한다.
-> 메모리 누수 방지, 애플리케이션 성능 최적화
1. Garbage Collection(GC)의 기본 개념
Garbage Collection : 더 이상 참조되지 않는 객체나 변수를 자동으로 정리하는 과정
- 자바스크립트 엔진이 메모리를 관리하는 중요한 방법
GC의 목표 : 사용하지 않는 메모리 자원을 해제하여 시스템의 성능을 최적화하고, 메모리 누수(memory leak)를 방지하는 것
- 자바스크립트에서는 "참조" 기반으로 메모리가 관리되므로, 참조되지 않는 객체들은 GC에 의해 정리된다.
2. GC가 정리하는 주요 메모리 유형
GC가 메모리를 관리할 때 정리하는 주요 객체들은 다음과 같다.
- 변수
: 함수 내부에서 선언된 지역 변수는 함수가 종료되면 더 이상 참조되지 않으므로 GC의 대상이 된다.
블록 스코프 내에서 선언된 변수(let, const)도 해당 블록이 종료되면 더 이상 참조되지 않아 GC 대상이 된다.
- 객체
: 객체는 더 이상 참조되지 않으면 GC에 의해 정리된다.
ex) 객체를 null로 설정하거나 다른 값으로 덮어쓰면 해당 객체는 참조되지 않으므로 GC 대상이 된다.
- 함수
: 함수가 더 이상 호출되지 않거나, 클로저가 아닌 경우 함수는 GC 대상이 된다.
클로저에 의해 참조되는 함수는 클로저가 유효한 동안 메모리에서 제거되지 않는다.
- 배열
: 배열 자체나 배열 내부의 요소들이 더 이상 참조되지 않는 경우에도 GC 대상이 된다.
배열 자체가 참조되지 않으면 배열의 메모리도 해제된다.
- DOM 요소
: 브라우저 환경에서 DOM 요소가 자바스크립트 객체에 의해 참조되지 않으면 GC에 의해 정리된다.
ex) document.getElementById()로 가져온 요소가 더 이상 참조되지 않으면 해당 DOM 요소는 GC에 의해 제거된다.
- 클로저
: 클로저는 함수와 그 함수가 선언된 Lexical Environment의 결합이다.
클로저로 인해 참조되는 변수나 함수는 클로저가 유효한 동안 메모리에 유지된다.
클로저가 더 이상 참조되지 않으면 해당 클로저도 GC 대상이 된다.
3. GC의 작동 원리 : Mark-and-Sweep 알고리즘
자바스크립트 엔진은 보통 Mark-and-Sweep 알고리즘을 사용하여 GC를 수행한다.
이 알고리즘은 크게 두 단계로 이뤄져있다.
1. Marking (표시)
: 모든 객체를 확인하여 현재 코드에서 참조하고 있는 객체들을 표시(mark) -> 참조된 객체는 "살아있는" 객체로 간주되고, 참조되지 않은 객체는 "죽은" 객체로 표시
2. Sweeping (청소)
: "죽은" 객체들을 메모리에서 해제하여 사용되지 않는 메모리 정리 -> 이 과정은 주기적으로 발생, 자바스크립트 엔진은 일정 시간마다 GC를 실행해 메모리를 최적화
4. 메모리 누수 방지
메모리 누수는 사용되지 않는 객체나 데이터가 메모리에서 해제되지 않아 시스템 성능을 저하시킬 수 있는 문제다.
자바스크립트의 GC는 이 문제를 방지하지만, 개발자가 관리해야 할 부분도 존재한다.
ex) 이벤트 리스너나 타이머가 해제되지 않으면 메모리 누수가 발생할 수 있다.
-> 이를 방지하기 위해서는 이벤트 리스너나 타이머를 명시적으로 제거하거나, 객체가 더 이상 필요하지 않다면 null로 설정하는 것이 필요하다 !
5. GC의 중요성
Garbage Collection은 자바스크립트의 자동 메모리 관리 시스템으로, 개발자가 명시적으로 메모리를 해제할 필요 없이 효율적인 메모리 관리가 가능하게 만들어준다.
GC를 이해하는 것은 메모리 누수 문제를 방지하고 애플리케이션의 성능을 최적화하는 데 중요하다.
자바스크립트에서 메모리를 효율적으로 관리하려면 GC가 어떻게 작동하는지, 그리고 자주 발생하는 메모리 누수 상황에 어떻게 대응할 수 있는지에 대해 이해하는 것이 필요하다.
'FRONTEND > JS' 카테고리의 다른 글
| 클로저 완전 정복 - 기초 개념부터 동작 원리까지 (3) | 2025.08.11 |
|---|---|
| [JS] globalThis의 필요성과 등장 배경 (1) | 2025.03.28 |
| [JS] 배열(Array)과 Set의 차이 (0) | 2025.03.23 |
| JavaScript에서 Strict Mode가 필요한 이유 + ESLint와의 차이점 (2) | 2025.03.11 |