1. 자바스크립트 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
: 살아남은 객체 중에서 데이터만 가지는 객체가 저장되는 영역입니다.
2. 자바스크립트 V8 엔진의 메모리 사용(스택 vs. 힙)
슬라이드를 보면,
- 글로벌 스코프는 스택의
Global frame
에 저장됩니다. - 함수를 호출할 때마다 해당 함수가 프레임 블록으로 스택에 추가되고, 함수 실행이 종료되면 스택에서 제거됩니다.
- 원시 타입은 스택에 바로 저장됩니다.
- 모든 객체 타입은 힙에 생성되고, 스택 포인터를 통해 스택에서 힙을 참조합니다.
- 메인 프로세스의 실행이 완료되면 스택에서 힙에 있는 객체를 참조하지 않으므로 힙에 남아있는 객체들은 고아(orphan)가 됩니다.
스택은 V8 엔진이 아니라 운영체제가 관리하기 때문에 개발자가 크게 신경 쓸 것이 없습니다. 하지만 힙은 운영체제가 자동으로 관리하지 않고, 다양한 동적 데이터를 저장하는 가장 큰 메모리 영역이기 때문에 메모리 관리에 신경써주어야 합니다.
이를 위해, 가비지 컬렉션이라는 기능이 존재합니다.
자바스크립트 가비지 컬렉션이 궁금하다면, 다음 글을 참고해주세요.
2.0.1. 참고
'Frontend' 카테고리의 다른 글
자바스크립트 가비지 컬렉팅(GC) 어디까지 알고있나? (1) | 2023.12.15 |
---|---|
[타입챌린지/type-challenge] Flatten (0) | 2023.02.04 |
-Like 타입은 뭘까? Array vs. ArrayLike / Promise vs. PromiseLike (0) | 2023.01.24 |