메모리 관리 관점으로 본 스택 & 힙 메모리
메모리 관리 관점에서 본 스택 메모리와 힙 메모리
운영체제
메모리 관리 관점에서 스택 방식과 힙 방식을 비교
스택 메모리
LIFO(Last In First Out) 구조로 작동 마치 책을 쌓아올리듯, 가장 나중에 들어온 데이터가 가장 먼저 나간다
주요 특징
1. 저장되는 데이터
- 지역 변수: 함수 내부에서 선언된 변수들
- 함수 매개변수: 함수 호출 시 전달되는 인자들
- 함수 반환 주소: 함수 실행 완료 후 돌아갈 위치 정보
- 원시 타입 데이터: 정수, 실수, 문자 등
2. 메모리 할당 방식
- 컴파일 타임에 크기 결정: 변수 크기를 미리 알 수 있음
- 자동 할당/해제: 함수 호출시 자동 할당, 종료시 자동 해제
- 순차적 할당: 메모리 주소가 연속적으로 할당
3. 성능 특성
- 매우 빠른 할당/해제: 단순히 스택 포인터만 이동
- 캐시 효율성 높음: 연속된 메모리 주소 사용
- 메모리 단편화 없음: 순차적 할당으로 인한 효율성
힙 메모리
동적 메모리 할당을 위한 영역 프로그램 실행 중에 필요에 따라 메모리를 할당하고 해제할 수 있는 공간
주요 특징
1. 저장되는 데이터
- 동적 객체: 런타임에 크기가 결정되는 객체들
- 배열: 크기가 가변적인 데이터 구조
- 참조 타입 데이터: 객체, 문자열, 배열 등의 복합 데이터
- 큰 데이터 구조: 크기가 큰 데이터는 스택에 올리기 어려움
2. 메모리 할당 방식
- 런타임에 크기 결정: 프로그램 실행 중에 메모리 요청, 필요한 만큼 할당
- 수동 관리: 개발자가 직접 메모리 할당/해제 또는 가비지 컬렉터가 관리
- 비순차적 할당: 메모리 주소가 연속적이지 않을 수 있음
3. 성능 특성
- 상대적으로 느린 할당/해제: 적절한 메모리 블록 찾기 필요
- 메모리 단편화 발생 가능: 할당/해제 반복으로 인한 빈 공간 생성
- 유연한 메모리 사용: 필요에 따라 크기 조정 가능
비교
| 항목 | 스택 | 힙 |
|---|---|---|
| 할당 속도 | 매우 빠름 | 상대적으로 느림 |
| 메모리 관리 | 제한적 (보통 1-8MB) | 상대적으로 큼 |
| 데이터 접근 | 순차적, 빠름 | 랜덤, 상대적으로 느림 |
| 메모리 해제 | 자동 (스코프 벗어나면) | 수동 또는 가비지 컬렉션 |
| 메모리 단편화 | 없음 | 발생가능 |
| 사용 용도 | 지역 변수, 함수 호출 | 동적 객체, 큰 데이터 구조 |