Node js 메모리 관리

Heechul Yoon·2021년 4월 23일
0

LOG

목록 보기
62/62

node js 는 어떻게 메모리 관리를 하는지 알아보자

V8 engine

V8엔진은 Javascript를 크롬브라우저에서 돌려주는 엔진이다. V8엔진은 Javascript를 assembly code로 컴파일해준다. node js는 V8엔진을 C++로 wrapping(?)해서 Operating System이 이해할 수 있게 해주는 자바스크립트 실행환경이다.

V8엔진은 메모리를 3개의 section으로 구분한다.

  • Code: 컴파일 된 코드가 실행되는 공간이다
  • Stack: 실행을 위한 데이터(로컬 변수) 및 포인터가 쌓이는 곳이다. 실행 후에는 사라진다
  • Heap:함수, 변수, 클래스의 선언들이 들어가는 곳이다.

모든 프로그램은 프로세스로서 존재하고, 리눅스에서 하나의 프로세스는 4GB의 메모리를 할당받는다. 물론 한번에 4GB의 물리메모리를 하나의 프로세스에 할당하지는 않는다. 가상메모리에 의해서 페이지 테이블에서 논리적으로 할당을 받는 것이다. CPU에서 요청하는 것이 메모리에 없으면 요구페이징에 의해서 물리메모리를 할당 받는 식으로 프로세스는 4GB의 공간을 효율적으로 활용한다.

다음의 C언어에서의 메모리관리상황을 확인해보자

char * buffer;
buffer = (char*) malloc (10);
// buffer 활용 ...
free (buffer);

위에서 처럼 C언어에서는 malloc()함수를 통해서 메모리상의 HEAP영역에 공간을 할당한다. 그리고 할당된 메모리에서 작업을 끝내면 free()함수를 통해서 HEAP영역에서의 공간을 해체한다.

이처럼 프로그래머는 하나의 프로세스에 할당된 메모리에대한 관리 책임을 지게된다.

하지만 우리는 javascript에서 malloc과 free와 같은 함수를 사용해서 메모리컨트롤을 하지 않고, 프로그램이 동작하다가 HEAP영역의 공간이 부족한 현상이 발생하게 될것이다. 이러한 현상을 memory leak이라고 한다.

다행히도 V8엔진은 garbage collection을 통해서 자동으로 메모리관리를 해준다. garbage collector는 referencing 되어있지 않은 변수들을 주기적으로 메모리에서 해체시킨다.

메모리상의 어떤 변수들을 collecting할지는 다양한 알고리즘이 있을 수 있기때문에 다음에 알아보자

profile
Quit talking, Begin doing

0개의 댓글