ougi FE

자바스크립트 가비지 컬렉션에 대해서 알아보자 본문

카테고리 없음

자바스크립트 가비지 컬렉션에 대해서 알아보자

ougi 2025. 7. 14. 20:59

오늘은 예전부터 자세히 알아보고 싶었던 가비지 컬렉션에 대해서 알아보겠습니다


가비지 컬렉션이란?

쓸모 없어진 객체가 차지하는 메모리를 자동으로 해제하는 것입니다

가비지 컬렉터가 자동으로 메모리 관리를 해줍니다

 

장점

  • 메모리 누수가 감소합니다
  • 메모리 관리에 신경쓰지 않을 수 있어서 생산성이 향상됩니다
  • 성능 손실을 최소화합니다

단점

  • 가비지 컬렉션이 언제 발생하는지 실행 타이밍을 예측할 수 없습니다
  • 메모리 누수를 완전히 막지는 못합니다
  • 개발자가 제어할 수 없습니다
  • 가비지 컬렉션을 실행할 때 CPU 자원을 소모하므로 대규모 애플리케이션에서는 성능 저하 요소가 될 수 있습니다

가비지 컬렉션 알고리즘

자바스크립트의 가비지 컬렉션에 사용되는 알고리즘은

참고-세기(Reference-counting)와 표시하고-쓸기(Mark-and-sweep) 알고리즘이 있습니다

참고-세기(Reference-counting)

참조-세기 알고리즘은 매우 단순합니다

이 알고리즘은 어떤 다른 객체도 참조하지 않는 객체를 더 이상 필요 없는 객체라고 생각하고

이 객체를 가비지 취급하며 이를 참조하는 다른 객체가 하나도 없는 경우 수집이 가능합니다

표시하고-쓸기(Mark-and-sweep) 알고리즘

이 알고리즘은 더 이상 필요없는 객체를 도달할 수 없는 객체로 정의합니다

이 알고리즘은 roots라는 객체의 집합을 가지고 있습니다 JS에서 roots(root의 복수)는 전역 객체입니다 

주기적으로 가비지콜렉터가 roots부터 roots가 참조하는 객체들, roots로부터 시작하여 가비지 콜렉터는 도달할 수 있는 모든 객체를 찾고

도달할 수 없는 모든 객체를 찾습니다

 

3가지 상태

  • white: 아직 가비지 컬렉터가 탐색하지 못한 상태
  • gray: 가비지 컬렉터가 탐색했으나 해당 객체가 참조하는 객체들은 탐색하지 못한 상태
  • black: 가비지 컬렉터가 탐색했고, 해당 객체가 참조하는 객체들도 탐색 완료한 상태

 


 

메모리 관리를 해야하는 이유

자바스크립트에서는 메모리를 특이한 환경에서 관리한다고 합니다

예를 들어서 엄청나게 많은 메모리를 소모하는 이상한 웹사이트를 들어갔다는 이유로

나의 컴퓨터 메모리를 전부 사용해버려서 강제 종료가 되버린다면 안될 것입니다

그래서 브라우저는 사용할 수 있는 메모리를 일부러 작게 만들었다고 합니다


V8 엔진 메모리 구조

JS의 메모리 생존주기도 대부분의 프로그래밍 언어와 유사합니다

  1. 필요할 떄 할당합니다
  2. 할당된 메모리를 사용합니다
  3. 더 이상 필요하지 않으면 해제합니다

v8 엔진에서 힙 메모리는 객체와 동적 데이터가 저장되는 공간이자 가비지 컬렉션이 발생하는 곳,

그 중에서도 New space, Old space에서 일어납니다

 

New space (Young Generation)란?

  • 새로 만들어진 객체가 저장되는 공간입니다
  • 아주 작은 크기가 할당되고 2개의 Semi space로 이루어져 있습니다 (To-space, From-space)
  • Scavenger라는 가비지 컬렉터가 관리하는 영역이고 Minor GC라고 합니다

Old space (Old Generation)

  • New space에서 살아남은 객체들이 저장되는 공간 (Minor GC가 2번이상 가비지 컬렉션을 실행해도 메모리 해제가 되지 않은 객체)
  • 포인터만 모아놓은 Old pointer sapce, 데이터만 모아놓은 Old data space로 나뉩니다
  • Major GC가 메모리를 관리합니다

Minor GC 동작과정

  1. 새로운 객체로 인해 New space 공간이 초과되는 상황
  2. To-space와 From-space의 역할 변경 및 가비지가 아닌 객체 이동
  3. 새로운 객체는 메모리가 확보된 To-space에 추가
  4. 다시 To-space 메모리가 초과되는 상황
  5. 2번 이상 살아남은 객체는 Old space로 이동

Major GC 동작과정

  1. Old space가 충분하지 않을 떄 Major GC가 가비지 컬렉션을 실행합니다
  2. 잠깐 멈춰서 동작하므로 성능에 영향이 커질 수 있어서 최적화를 해야합니다

글을 마치며

오늘은 GC에 대해서 좀 더 자세히 알아보았는데 오랜만에 깊게 공부한 기분이 들어서 재밌었던거 같습니다

글을 읽어주셔서 감사합니다

728x90