아티클 목록

HEAP, STACK 정리

HEAP? STACK?

쓰레드마다 스택이 있고, 일반적으로 힙 공간은 쓰레드끼리 공유함

Heap

  • 동적 할당(인스턴스 변수, 객체)을 위한 메모리 공간
  • 스택과 다르게 힙에선 메모리 블럭들의 할당, 해제 패턴이 강제되지 않음
  • 때문에 원할때 원하는 만큼 블럭들을 할당, 해제 가능하기 때문에 스택에 비해 메모리 공간의 할당, 해제를 추적하기 복잡함

Stack

  • 쓰레드 실행을 위해 임시 저장 공간(Scratch Space)으로 사용되는 메모리 공간
  • 함수 호출 시 스택 최상단 메모리 블럭이 로컬 변수 등 일부 데이터를 위해 점유됐다가 사용이 끝나면 사용 해제됨
  • 스택은 함수 호출 순서대로 메모리 블럭이 점유되고 먼저 점유된 순서대로 해제됨, LIFO(Last In First Out)
  • LIFO 구조이기 때문에 스택 추적은 간단함

heap&stack

OS 또는 언어 런타임에 의해 힙과 스택은 어느 정도로 제어되는지?

OS는 쓰레드가 생성될 때 시스템 레벨 쓰레드마다 스택을 할당, 일반적으로 언어 런타임이 힙 영역 할당을 위해 OS를 호출함

힙과 스택의 스코프?

스택은 쓰레드에 붙음, 쓰레드가 종료되면 스택은 환원됨, 힙은 일반적으로 런타임에 의해 앱 시작 시 할당되고 앱이 종료 시 (또는 프로세스가 완료 시) 환원됨

힙과 스택의 사이즈는 어떻게 결정되는지?

스택 사이즈는 쓰레드가 만들어질 때 결정됨, 힙 사이즈는 앱이 시작될 때 설정됨. 그러나 할당자가 OS에 메모리를 추가로 요구한다면 필요에 의해서 사이즈는 더 커질 수 있음.

힙과 스택 중 어느게 더 빠름?

스택이 힙보다 메모리 할당, 해제하는 접근 패턴이 간단하기 때문에 스택이 더 빠름. 그리고 스택 내 자주 쓰이는 내용들은 프로세서 캐시에 맵핑될 수 있어 더 빠를 수 있음. 힙은 쓰레드끼리 공유하므로 멀티쓰레드 세이프해야 함. 때문에 쓰레드끼리 메모리 할당, 해제 시 동기되어야 하는 부분이 존재하므로 스택보다 느릴 수 밖에 없음.

참고

댓글