아티클 목록
HEAP, STACK 정리
HEAP? STACK?
쓰레드마다 스택이 있고, 일반적으로 힙 공간은 쓰레드끼리 공유함
Heap
- 동적 할당(인스턴스 변수, 객체)을 위한 메모리 공간
- 스택과 다르게 힙에선 메모리 블럭들의 할당, 해제 패턴이 강제되지 않음
- 때문에 원할때 원하는 만큼 블럭들을 할당, 해제 가능하기 때문에 스택에 비해 메모리 공간의 할당, 해제를 추적하기 복잡함
Stack
- 쓰레드 실행을 위해 임시 저장 공간(Scratch Space)으로 사용되는 메모리 공간
- 함수 호출 시 스택 최상단 메모리 블럭이 로컬 변수 등 일부 데이터를 위해 점유됐다가 사용이 끝나면 사용 해제됨
- 스택은 함수 호출 순서대로 메모리 블럭이 점유되고 먼저 점유된 순서대로 해제됨, LIFO(Last In First Out)
- LIFO 구조이기 때문에 스택 추적은 간단함

OS 또는 언어 런타임에 의해 힙과 스택은 어느 정도로 제어되는지?
OS는 쓰레드가 생성될 때 시스템 레벨 쓰레드마다 스택을 할당, 일반적으로 언어 런타임이 힙 영역 할당을 위해 OS를 호출함
힙과 스택의 스코프?
스택은 쓰레드에 붙음, 쓰레드가 종료되면 스택은 환원됨, 힙은 일반적으로 런타임에 의해 앱 시작 시 할당되고 앱이 종료 시 (또는 프로세스가 완료 시) 환원됨
힙과 스택의 사이즈는 어떻게 결정되는지?
스택 사이즈는 쓰레드가 만들어질 때 결정됨, 힙 사이즈는 앱이 시작될 때 설정됨. 그러나 할당자가 OS에 메모리를 추가로 요구한다면 필요에 의해서 사이즈는 더 커질 수 있음.
힙과 스택 중 어느게 더 빠름?
스택이 힙보다 메모리 할당, 해제하는 접근 패턴이 간단하기 때문에 스택이 더 빠름. 그리고 스택 내 자주 쓰이는 내용들은 프로세서 캐시에 맵핑될 수 있어 더 빠를 수 있음. 힙은 쓰레드끼리 공유하므로 멀티쓰레드 세이프해야 함. 때문에 쓰레드끼리 메모리 할당, 해제 시 동기되어야 하는 부분이 존재하므로 스택보다 느릴 수 밖에 없음.