jaenny.dev
article thumbnail

자바스크립트 V8 엔진의 메모리 구조

자바스크립트 V8 엔진의 메모리 구조. 출처:  https://deepu.tech/memory-management-in-v8/

V8 엔진에서 메모리는 크게 스택(Stack)힙(Heap)으로 구성됩니다.

  • 스택(Stack) : 원시 타입 변수, 함수 인자, 객체를 가리키는 포인터 등이 저장되는 공간입니다.
  • 힙(Heap) : 객체 타입과 같이 동적인 데이터를 저장하는 공간입니다. 아래 영역들로 세분화 됩니다.
    • New space : Young generation 이라고도 하는 이 영역은 짧은 생명 주기(short- lived) 를 가지는 새로 생성된 객체가 저장되는 공간입니다. 두 개의 semi-space가 있으며, Scavenger(Minor GC) 가 이 영역을 관리합니다.
    • Old space: Old generation 이라고도 하는 이 영역은 New space에서 두 번의 Minor GC가 발생할 동안 가비지 컬렉트 되지 않고 살아남은 객체들이 이동하는 공간입니다. Major GC(Mark-Sweep & Mark-Compact) 가 이 영역을 관리하며, 다음의 두 영역으로 다시 나뉩니다:
      • Old pointer space : 살아남은 객체 중에서 다른 객체를 참조하는 객체가 저장되는 영역입니다.
      • Old data space : 살아남은 객체 중에서 데이터만 가지는 객체가 저장되는 영역입니다.

자바스크립트 V8 엔진의 메모리 사용(스택 vs. 힙)

슬라이드를 보면,

  • 글로벌 스코프는 스택의 Global frame에 저장됩니다.
  • 함수를 호출할 때마다 해당 함수가 프레임 블록으로 스택에 추가되고, 함수 실행이 종료되면 스택에서 제거됩니다.
  • 원시 타입은 스택에 바로 저장됩니다.
  • 모든 객체 타입은 힙에 생성되고, 스택 포인터를 통해 스택에서 힙을 참조합니다.
  • 메인 프로세스의 실행이 완료되면 스택에서 힙에 있는 객체를 참조하지 않으므로 힙에 남아있는 객체들은 고아(orphan)가 됩니다.

스택은 V8 엔진이 아니라 운영체제가 관리하기 때문에 개발자가 크게 신경 쓸 것이 없습니다. 하지만 힙은 운영체제가 자동으로 관리하지 않고, 다양한 동적 데이터를 저장하는 가장 큰 메모리 영역이기 때문에 메모리 관리에 신경써주어야 합니다.

이를 위해, 가비지 컬렉션이라는 기능이 존재합니다.

자바스크립트 가비지 컬렉션이 궁금하다면, 다음 글을 참고해주세요.

참고

profile

jaenny.dev

@jaenny.dev

Go Beyond! Front-end developer, jaenny✨