Node.js는 Google의 V8 JavaScript 엔진을 기반으로 해 메모리를 관리한다.
실행 중인 Node.js 프로그램은 Resident Set이라는 메모리 공간에서 표현되며, 이는 다음과 같이 구성된다.
즉, 데이터 타입에 따라서 자동으로 스택이나 힙에 할당된다.
V8의 세대별 가설을 기반으로 메모리를 관리한다.
이는 대부분의 객체가 짧은 생명주기를 가진다는 가정 하에 힙을 두 개의 세대로 나눈다.
스택은 지역변수와 함수 호출 정보를 저장하는 LIFO 구조다.
힙과 달리 가비지 컬렉터가 관리하지 않으며, 함수가 반환될 때 자동으로 해제된다.
가비지 컬렉션: 메모리 관리 방법 중 하나, 동적으로 할당한 메모리 영역 중 더 이상 쓰이지 않는 영역을 자동으로 찾아내어 해제
console.log(process.memoryUsage());
위 메소드를 통해 메모리 사용량을 실시간으로 확인한다.
--max-old-space-size: Old Space의 최대 크기를 설정--max-semi-space-size: New Space의 최대 크기를 설정| 일반 메모리 | Node.js |
|---|---|
| 필요한 메모리 할당 | JS는 메모리 할당과 해제를 자동으로 처리 |
| 할당된 메모리 사용(읽기, 쓰기) | 개발자가 명시적으로 메모리를 관리할 필요가 없음 |
| 더 이상 필요하지 않을 때 메모리 해제 | 가비지 컬렉션을 통한 자동 메모리 정리 |
| 일반 메모리 | Node.js |
|---|---|
| 스택과 힙으로 구분 | V8 엔진의 세대별 힙 구조 사용 |
| 스택: 정적 데이터(문자열 값, 객체 주소) | New Space와 Old Space로 세분화된 힙 관리 |
| 힙: 동적 데이터(객체 포함) | 객체의 생명주기에 따른 효율적 메모리 관리 |
| 일반 메모리 | Node.js |
|---|---|
| 참조 카운팅 방식: 참조 횟수가 0이 되면 해제 | Mark-and-Sweep 알고리즘 사용 |
| 루트에서 도달 가능한지 여부로 판단 | |
| 순환 참조 문제 발생 가능 | 순환 참조 문제 해결 |