JavaScript 메모리 구조
JavaScript의 메모리 구조는 주로 세 가지 주요 영역으로 나뉩니다: 스택(Stack), 힙(Heap), 그리고 코드(Code) 영역입니다. 각 영역은 특정 종류의 데이터를 저장하고 관리하는 데 사용됩니다.
1. 스택 영역 (Stack Area)
역할:
- 함수 호출 시 생성되는 호출 스택(Call Stack)과 로컬 변수(Local Variables)를 저장합니다.
- 스택 메모리는 고정된 크기를 가지며, 매우 빠르게 데이터를 할당하고 해제할 수 있습니다.
구조:
- 콜 스택(Call Stack): 함수 호출과 반환이 기록됩니다. 함수가 호출될 때마다 새로운 스택 프레임이 추가되고, 함수가 종료되면 해당 프레임이 제거됩니다.
- 로컬 변수: 함수 내에서 선언된 변수들이 저장됩니다.
┌─────────────────────────┐ ┌─────────────────┐
│ Call Stack │ │ Local Variables │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Func A │ │ │ │ let 1 │ │
│ │─────────────│ │ │ │─────────────│ │
│ │ Func B │ │ │ │ const 2 │ │
│ └─────────────┘ │ │ └─────────────┘ │
│ │ │ │
└─────────────────────────┘ └─────────────────┘
2. 힙 영역 (Heap Area)
역할:
- 객체(Object)와 배열(Array)과 같은 참조 타입 데이터를 저장합니다.
- 동적 메모리 할당을 처리하며, 가비지 컬렉션에 의해 메모리가 관리됩니다.
구조:
- 객체와 배열: 힙은 크기가 변할 수 있는 동적 데이터를 저장하는 데 사용됩니다. 이 데이터는 참조에 의해 접근됩니다.
┌─────────────────────────┐
│ Heap │
│ ┌─────────────┐ │
│ │ {obj1: ...} │ │
│ │─────────────│ │
│ │ [arr1, ...] │ │
│ └─────────────┘ │
│ │
└─────────────────────────┘
3. 코드 영역 (Code Area)
역할:
- 함수 정의(Function Definitions)와 전역 변수(Global Variables)를 저장합니다.
- 코드 자체와 상수 데이터(Constant Data)를 저장합니다.
구조:
- 함수 정의: 프로그램 실행 시점에서 로드된 함수 코드가 저장됩니다.
- 전역 변수: 프로그램 전체에서 사용되는 변수가 저장됩니다.
┌─────────────────────────┐
│ Code │
│ ┌─────────────┐ │
│ │ function A()│ │
│ │─────────────│ │
│ │ var global │ │
│ └─────────────┘ │
│ │
└─────────────────────────┘
이벤트 루프와 콜 스택
이벤트 루프(Event Loop):
- JavaScript는 싱글 스레드 언어로, 이벤트 루프는 비동기 작업을 처리하는 데 중요한 역할을 합니다.
- 이벤트 루프는 콜 스택이 비어 있을 때 태스크 큐(Task Queue)에서 콜백을 가져와 실행합니다.
콜 스택(Call Stack):
- 현재 실행 중인 함수가 쌓이는 데이터 구조입니다.
- 함수 호출 시 스택에 쌓이고, 함수 종료 시 스택에서 제거됩니다.
┌──────────────────────────────┐
│ JavaScript Engine │
│ ┌──────────────┐ ┌────────┐ │
│ │ Call Stack │ │ Heap │ │
│ │ ┌────────┐ │ │ ┌────┐ │ │
│ │ │ Func A │ │ │ │Obj1│ │ │
│ │ └────────┘ │ │ └────┘ │ │
│ │ ┌────────┐ │ │ ┌────┐ │ │
│ │ │ Func B │ │ │ │Arr1│ │ │
│ │ └────────┘ │ │ └────┘ │ │
│ └──────────────┘ └────────┘ │
│ ┌───────────────────────────┐ │
│ │ Local Variables │ │
│ │ ┌───────────┐ ┌───────┐ │ │
│ │ │ let c │ │ Obj 1 │ │ │
│ │ │ let d │ │ Arr 1 │ │ │
│ │ └───────────┘ └───────┘ │ │
│ └───────────────────────────┘ │
└──────────────────────────────┘
│
│
┌──────────────────────────────┐
│ Event Loop │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Task Queue │
│ ┌──────────────┐ ┌────────┐ │
│ │ setTimeout │ │Promise │ │
│ │ callback │ │callback│ │
│ └──────────────┘ └────────┘ │
└──────────────────────────────┘
React와 메모리 구조
React도 JavaScript를 기반으로 하므로 기본적인 메모리 구조는 동일합니다. 그러나 React는 컴포넌트 기반 아키텍처와 가상 DOM(Virtual DOM)을 사용하여 메모리를 관리하고 최적화합니다.
React의 메모리 관리:
- 컴포넌트 상태 (Component State):
- 각 컴포넌트의 상태(State)는 힙에 저장됩니다.
- 상태 변경이 발생하면, React는 이를 감지하고 컴포넌트를 다시 렌더링합니다.
- 가상 DOM (Virtual DOM):
- 실제 DOM과의 차이를 최소화하기 위해 메모리 상에서 가상 DOM을 사용합니다.
- 가상 DOM은 실제 DOM의 가벼운 복제본이며, 변경 사항을 효율적으로 관리합니다.
- 컴포넌트 라이프사이클 (Component Lifecycle):
- 컴포넌트의 생성과 소멸에 따라 메모리가 할당되고 해제됩니다.
- React는 컴포넌트 라이프사이클 메서드를 통해 메모리 관리 및 최적화를 수행합니다.
// 기본 메모리 구조는 JS와 동일
┌─────────────────────────┐ ┌─────────────────┐
│ Call Stack │ │ Local Variables │
│ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ Func A │ │ │ │ let 1 │ │
│ │─────────────│ │ │ │─────────────│ │
│ │ Func B │ │ │ │ const 2 │ │
│ └─────────────┘ │ │ └─────────────┘ │
│ │ │ │
└─────────────────────────┘ └─────────────────┘
React의 메모리 관리
컴포넌트 상태:
┌─────────────────────────┐
│ Heap │
│ ┌─────────────┐ │
│ │{state: ...} │ │
│ │─────────────│ │
│ │{props: ...} │ │
│ └─────────────┘ │
│ │
└─────────────────────────┘
가상 DOM:
┌─────────────────────────┐
│ Virtual DOM │
│ ┌─────────────┐ │
│ │ <div> │ │
│ │ <h1> │ │
│ │ Text │ │
│ │ </h1> │ │
│ │ </div> │ │
│ └─────────────┘ │
│ │
└─────────────────────────┘
React 컴포넌트 라이프사이클
┌───────────────────────────────────────────────────────┐
│ Component Lifecycle │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ Mounting │ │ Updating │ │
│ │ ┌─────────────┐ │ │ ┌──────┐ │ │
│ │ │ constructor │ │ │ │render│ │ │
│ │ └─────────────┘ │ │ └──────┘ │ │
│ │ ┌─────────────────┐ │ │ ┌──────────────────────┐│ │
│ │ │componentDidMount│ │ │ │ shouldComponentUpdate││ │
│ │ └─────────────────┘ │ │ └──────────────────────┘│ │
│ └─────────────────────┘ └─────────────────────────┘ │
│ │
│ ┌────────────────────────┐ │
│ │ Unmounting │ │
│ │ ┌────────────────────┐ │ │
│ │ │componentWillUnmount│ │ │
│ │ └────────────────────┘ │ │
│ └────────────────────────┘ │
└───────────────────────────────────────────────────────┘
'TIL' 카테고리의 다른 글
TIL - 배럴 파일 구조를 통한 효율적인 컴포넌트 관리 (0) | 2024.06.26 |
---|---|
TIL - 개인 프로젝트, 영화 추천 사이트 - 1 (0) | 2024.06.25 |
TIL - 이번 주 팀 프로젝트 KPT 회고 (0) | 2024.06.21 |
TIL - React Router에서 navigate와 Link의 차이점 (0) | 2024.06.20 |
TIL - React 훅 소개 (0) | 2024.06.19 |