자바스크립트에서의 Garbage Collection

2025. 3. 16. 23:21·FRONTEND/JS

자바스크립트 - 자동 메모리 관리 언어로, 개발자는 직접 메모리 해제를 관리하지 않아도 된다.

 

자바스크립트 엔진은 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
'FRONTEND/JS' 카테고리의 다른 글
  • 클로저 완전 정복 - 기초 개념부터 동작 원리까지
  • [JS] globalThis의 필요성과 등장 배경
  • [JS] 배열(Array)과 Set의 차이
  • JavaScript에서 Strict Mode가 필요한 이유 + ESLint와의 차이점
uoaheu
uoaheu
uoaheu 님의 블로그 입니다.
  • uoaheu
    uoaheu 님의 블로그
    uoaheu
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • 알고리즘 (7)
      • CS (9)
      • FRONTEND (9)
        • React (12)
        • Kotlin (1)
        • JS (5)
        • HTML (2)
      • SQL (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준1926번
    mysql 피벗테이블
    토스 uiux
    엘지유플러스유레카프론트엔드
    토스 앱 분석
    유레카3기
    부트캠프후기
    useactionstate
    알고리즘
    멀티캠퍼스it부트캠프
    BFS
    리액트usestate
    boj25418
    혼자서 공부하는 네트워크
    toss uiux
    mysql로 피벗테이블만들기
    mysql
    토스분석
    이더넷프레임
    toss 분석
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
uoaheu
자바스크립트에서의 Garbage Collection
상단으로

티스토리툴바