티스토리 뷰

V8의 메모리 흐름과 GC 과정을 모듈화된 구조로 표현한 일러스트

 

 자바스크립트는 자동으로 메모리를 관리해 주기 때문에 메모리 구조를 잘 몰라도 개발이 가능합니다. 하지만 서비스가 커지고, 사용자 수가 많아질수록 메모리 누수, 성능 저하 문제가 발생하기 쉽습니다. 이 글에서는 V8 엔진의 메모리 구조와 GC(Garbage Collector)의 작동 원리를 상세하게 설명하고, 실무에서 주의해야 할 메모리 관리 팁도 함께 정리합니다.

V8의 메모리 구조 – 스택과 힙

 V8은 자바스크립트 코드를 실행할 때 두 가지 메모리 공간을 사용합니다: 스택(Stack)힙(Heap)입니다.

  • 스택(Stack)
    • 크기가 작고, 빠르게 처리되어야 하는 고정된 데이터를 저장합니다.
    • 예) 함수 호출, 지역 변수, 기본 타입 값 등
  • 힙(Heap)
    • 동적으로 크기를 조절할 수 있는 큰 메모리 공간입니다.
    • 객체, 배열, 함수 등 복잡한 데이터를 저장하며, GC의 대상이 되는 영역이기도 합니다.

 힙 메모리는 자동으로 관리되지만, 그 구조와 흐름을 이해하지 못하면 메모리 누수(leak)가 발생할 수 있습니다.

 

 누수란 사용하지 않는 데이터가 힙에 남아 GC가 회수하지 못한 상태를 말합니다. 시간이 지날수록 메모리 사용량이 증가하고, 결국 브라우저가 느려지거나, 앱이 멈출 수 있습니다.

GC(Garbage Collector)의 작동 원리

 V8의 Garbage Collector는 사용하지 않는 메모리를 자동으로 찾아서 해제해 주는 역할을 합니다. 힙 메모리는 다음 두 영역으로 나뉩니다:

  1. New Space (신규 영역)
    • 생성된 지 얼마 안 된 객체가 저장됩니다.
    • 크기가 작으며, 짧은 생명 주기의 객체를 빠르게 회수하기 위해 사용됩니다.
    • Scavenge 알고리즘이 적용되어 짝수영역(Semi space) 간에 객체를 복사하며 살아있는 객체만 남깁니다.
  2. Old Space (오래된 영역):
    • 일정 시간 동안 살아남은 객체는 이 영역으로 이동됩니다.
    • 크기가 크고, 정교한 방식으로 GC가 수행됩니다.
    • Mark-and-SweepMark-and-Compact 알고리즘으로 작동하며, 사용되지 않는 객체를 찾아 제거하고, 조각난 메모리를 정리합니다.

 이 두 영역을 나눔으로써 V8은 짧고 빠른 GC(New Space)느리지만 정밀한 GC(Old Space)를 병행합니다. 이를 통해 전체 애플리케이션의 퍼포먼스를 유지하면서 메모리를 안정적으로 관리합니다.

메모리 누수를 막기 위한 실무 팁

 메모리 누수는 사용자가 직접 관리하지 않는다고 방심할 때 발생합니다. V8의 GC가 자동으로 작동하지만, 다음과 같은 상황에서는 누수가 발생할 수 있습니다.

  • 이벤트 리스너를 제거하지 않은 경우: DOM 요소가 사라졌는데 이벤트 리스너가 남아 있으면 객체가 힙에서 해제되지 않습니다.
  • 전역 변수 남용: 전역 변수는 앱 종료 전까지 살아 있기 때문에 불필요한 데이터가 오래 남습니다.
  • 클로저 사용 시 주의 부족: 클로저 안에 참조된 외부 변수가 예상보다 오래 살아남아 힙을 차지하는 경우가 있습니다.
  • 타이머(setTimeout, setInterval)를 정리하지 않은 경우: 타이머가 계속 실행 중이면 해당 함수와 변수도 GC 대상이 되지 못합니다.

 이러한 문제를 방지하기 위해서는 명시적인 해제null 할당, removeEventListener 사용, setTimeout clear 등 기본적인 관리 습관이 중요합니다.

 또한, 개발 중에는 Chrome의 DevTools > Memory 탭이나 Performance 탭을 활용해 메모리 스냅샷을 비교하고 누수 여부를 점검하는 것이 좋습니다.

 V8의 메모리 관리와 GC 작동 원리는 눈에 보이지 않지만, 자바스크립트 성능의 핵심 요소입니다.

 스택과 힙의 구분, GC의 작동 방식(New Space와 Old Space), 메모리 누수의 원인 등을 이해하고 있으면, 퍼포먼스 병목을 줄이고 안정적인 서비스를 운영할 수 있습니다.

 

 코드가 복잡해질수록, 이런 기초 원리를 바탕으로 성능을 설계하는 역량이 필요합니다.

 “자바스크립트는 자동으로 메모리를 관리한다”는 말의 이면에는, 우리가 더 잘 설계해야 할 책임도 함께 있다는 점을 기억해야 합니다.

반응형
반응형
공지사항
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more