1. 소개
* 소개
- V8 엔진은 웹 브라우저를 만드는 데 기반을 제공하는 오픈 소스 자바스크립트 엔진이다. 자바스크립트는 인터프리터 언어이기 때문에 코드를 해석하고 실행하는 엔진이 필요하다. V8은 자바스크립트를 컴파일하고 실행한다.
- 필자는 웹 프론트 분야를 공부하며 자바스크립트를 사용하기 때문에 V8 엔진의 메모리 관리에 대해 공부하며 정리하고자 한다.
- V8엔진은 노드JS, Deno, Electron과 같은 런타임 뿐만 아니라 크롬, 크로미움, 오페라, 엣지 등의 브라우저에서도 사용되므로 V8 엔진의 메모리 관리를 공부하는 것은 매우 중요하다.
2. 메모리 구조
* V8 메모리 구조
- 자바스크립트는 단일 스레드이고, V8 역시 자바스크립트 컨텍스트 당 단일 프로세스를 사용한다.
- 실행 중인 프로그램은 v8프로세스에 할당된 메모리로 표시되고 이를 Resident Set이라 한다. 이를 세부적으로 보면 다음과 같다.
- 크게 힙 영역과 스택영역으로 나눠져 있음을 알 수 있다. 하나하나 알아보자.
* 스택
- 스택은 메모리 영역이다.
- v8 프로세스마다 하나의 스택을 가진다.
- 스택은 메서드와 함수 프레임, 원시 값, 객체 포인터를 포함한 정적 데이터가 저장된다.
- 호출된 함수는 스택의 맨 위에 푸시되고 반환되면 스택에서 제거된다.
- 메인 프로세스가 완료되면 힙의 객체는 스택에서 더 이상 포인터를 갖지 않고 고아가 된다.
- 스택은 V8이 아닌 운영체제에서 관리된다.
* 힙
- 힙 영역은 V8에서 객체 또는 동적인 데이터가 저장되는 공간이다. 메모리의 가장 큰 영역이며 가비지컬렉션이 발생한다.
- New space(Young generation) : 새로운 객체가 저장되는 곳이다. 이 객체들은 짧은 생명주기를 가지며 Scavenger(마이너 가비지컬렉션)에 의해 관리된다.
- Old space(Old generation) : 두 번의 마이너 가비지 컬렉션 주기동안 New space에서 살아남은 객체들이 이동되어 관리된다. 이들은 Major GC에 의해 관리된다.
- Large object space : 매우 큰 객체들이 존재하는 곳이다. 가비지 컬렉션에 걸리지 않는다.
- Code space : 컴파일링된 코드를 저장하는 곳이다. 유일하게 실행 가능한 메모리가 있는 곳이다.
- Cell space, Property cell space, Map space : 각각 Cells, PropertyCells, Maps를 포함한다.
- 위의 각 영역은 페이지들로 구성되어있으며, 각 페이지 크기는 Large object space를 제외하고 1MB이다.
3. 가비지 컬렉션
* 소개
- 스택은 운영체제에 의해 자동으로 관리되지만 힙은 그렇지 않다. 따라서 별도로 관리하지 않으면 프로그램 메모리가 부족해질 수 있다. 게다가 속도저하의 원인이 된다.
- V8엔진은 참조 없는 객체 (고아)들의 메모리를 해제하여 공간을 만든다. 이러한 역할을 하는 것이 가비지 컬렉션이다.
* Minor GC
- Scavenger라고도 하며 New space영역을 정리하는 역할을 한다.
- 새 객체를 위한 공간을 예약하려고 할 때마다 증가하는 할당 포인터가 있는데 이 포인터가 공간의 끝에 도달하면 Minor GC가 트리거된다.
- 자주 발생하며 매우 빠르게 진행된다.
* Major GC
- Major GC는 Old space를 정리하는 역할을 한다.
- V8 엔진이 Old space가 공간이 부족하다고 판단할 때 트리거된다.
- Minor GC에서 사용한 Scavenger 알고리즘은 작은 데이터 크기에 적합하다. 메모리 오버헤드가 발생하므로 Old 영역에는 적합하지 않다.
- 따라서 Major GC에서는 Mark-Sweep-Compact 알고리즘을 사용하여 가비지컬렉터를 수행한다.
참고
'Computer Science > Computer Organization' 카테고리의 다른 글
<컴퓨터 구조> 메모리 교환, 스택, 힙 (0) | 2021.02.19 |
---|---|
<메모리> 문자열과 메모리 (0) | 2021.02.18 |
<메모리> 메모리와 포인터 (0) | 2021.02.17 |
<컴퓨터 구조> 컴파일링과 디버깅 (0) | 2021.01.27 |
<컴퓨터 구조> 하드웨어의 한계 (0) | 2021.01.20 |