본문 바로가기

Computer Science/Computer Organization

<메모리> V8 엔진의 메모리

 

1. 소개

* 소개

 - V8 엔진은 웹 브라우저를 만드는 데 기반을 제공하는 오픈 소스 자바스크립트 엔진이다. 자바스크립트는 인터프리터 언어이기 때문에 코드를 해석하고 실행하는 엔진이 필요하다. V8은 자바스크립트를 컴파일하고 실행한다. 

 

 - 필자는 웹 프론트 분야를 공부하며 자바스크립트를 사용하기 때문에 V8 엔진의 메모리 관리에 대해 공부하며 정리하고자 한다.

 

 - V8엔진은 노드JS, Deno, Electron과 같은 런타임 뿐만 아니라 크롬, 크로미움, 오페라, 엣지 등의 브라우저에서도 사용되므로 V8 엔진의 메모리 관리를 공부하는 것은 매우 중요하다.

 

2. 메모리 구조

* V8 메모리 구조

 - 자바스크립트는 단일 스레드이고, V8 역시 자바스크립트 컨텍스트 당 단일 프로세스를 사용한다.

 

 - 실행 중인 프로그램은 v8프로세스에 할당된 메모리로 표시되고 이를 Resident Set이라 한다. 이를 세부적으로 보면 다음과 같다.

 

https://deepu.tech/memory-management-in-v8/

 - 크게 힙 영역과 스택영역으로 나눠져 있음을 알 수 있다. 하나하나 알아보자.

 

* 스택

 - 스택은 메모리 영역이다.

 

 - 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 알고리즘을 사용하여 가비지컬렉터를 수행한다.

 

 

 


참고

 

 

V8 (자바스크립트 엔진) - 위키백과, 우리 모두의 백과사전

V8 (자바스크립트 엔진) 위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

 

🚀 Visualizing memory management in V8 Engine (JavaScript, NodeJS, Deno, WebAssembly)

Let us take a look at how the V8 engine for JavaScript & WebAssembly manages memory for Browsers and NodeJS.

deepu.tech