본문 바로가기
카테고리 없음

[메모리 관리] 프로세스 메모리 관리

by hbIncoding 2024. 7. 18.
  1. 일반적인 프로세스 메모리 관리
  • 텍스트 (코드) 세그먼트:
    • 실행 가능한 코드가 저장되는 영역입니다.
    • 보통 읽기 전용입니다.
  • 데이터 세그먼트:
    • 초기화된 전역 및 정적 변수가 저장되는 영역입니다.
    • 보통 읽기/쓰기가 가능합니다.
    • 두 개의 부분으로 나눌 수 있습니다:
      • 초기화된 데이터 세그먼트: 초기화된 전역 및 정적 변수가 저장됨.
      • 초기화되지 않은 데이터 세그먼트 (BSS): 초기화되지 않은 전역 및 정적 변수가 저장됨.
  • 힙 (Heap):
    • 동적 메모리 할당이 이루어지는 영역입니다.
    • 프로그램 실행 중 malloc, free, new, delete와 같은 함수 호출을 통해 메모리를 할당하고 해제합니다.
    • 힙은 아래로 확장됩니다 (높은 주소로).
  • 스택 (Stack):
    • 함수 호출과 지역 변수를 저장하는 영역입니다.
    • 각 함수 호출은 스택 프레임을 생성하고, 함수가 종료되면 해당 프레임을 제거합니다.
    • 스택은 위로 확장됩니다 (낮은 주소로).

2. Node.js의 프로세스 메모리 관리

 

  • V8 엔진:
    • V8은 힙 기반 메모리 할당과 가비지 컬렉션을 사용합니다.
    • V8 힙은 두 개의 주요 영역으로 나뉩니다:
      • 새로운 객체를 위한 Young Generation.
      • 오래된 객체를 위한 Old Generation.
    • Mark-and-sweep, generational, incremental, 및 lazy sweeping과 같은 다양한 가비지 컬렉션 기법을 사용하여 메모리를 관리합니다.
  • 메모리 할당:
    • JavaScript 객체는 V8 힙에 할당됩니다.
    • Node.js는 네이티브 모듈이나 버퍼와 같은 추가적인 메모리 할당을 관리합니다.
    • 네이티브 애드온이나 C++ 코드를 사용하는 경우, 개발자는 직접 메모리를 관리해야 합니다.
  • 가비지 컬렉션 (Garbage Collection):
    • V8의 가비지 컬렉션은 자동으로 메모리를 관리합니다.
    • JavaScript 객체가 더 이상 참조되지 않으면 가비지 컬렉터가 이를 수집하여 메모리를 해제합니다.
    • V8의 가비지 컬렉터는 주기적으로 실행되며, 메모리 누수를 방지합니다.
  • 메모리 제한:
    • Node.js의 기본 힙 크기는 제한되어 있습니다 (일반적으로 1.5GB에서 2GB 사이).
    • 힙 크기를 늘리려면 --max-old-space-size 플래그를 사용하여 커맨드 라인에서 설정할 수 있습니다.

3. 일반적인 메모리 관리와 node.js의 메모리 관리 차이점

 

  • 메모리 영역: 일반적인 프로세스 메모리 모델은 코드, 데이터, 힙, 스택으로 구분되지만, Node.js에서는 주로 V8 힙과 네이티브 메모리 할당으로 구분됩니다.
  • 메모리 관리: 일반적인 프로세스는 개발자가 직접 메모리를 할당하고 해제해야 하는 반면, Node.js는 V8 엔진이 가비지 컬렉션을 통해 자동으로 메모리를 관리합니다.
  • 동적 할당: Node.js는 JavaScript의 동적 성격을 반영하여 메모리를 동적으로 할당하고 해제합니다. 일반적인 프로세스에서는 동적 할당이 힙에서 이루어지며, 명시적인 할당과 해제가 필요합니다.
  • 가비지 컬렉션: Node.js는 가비지 컬렉션을 통해 메모리 관리를 자동화하지만, 일반적인 프로세스에서는 가비지 컬렉션이 없는 경우가 많습니다. 일반적인 프로세스에서는 메모리 누수를 방지하기 위해 메모리를 명시적으로 해제해야 합니다.