Swift 메모리 구조
코드 영역
- 실행 코드가 저장되는 공간
- 컴파일된 소스 코드와 프로그램의 명령어가 저장되어 있는 공간
- 읽기 전용 (Read-Only), 프로그램이 실행되면서 수정되지 않는다 ( 프로그램 시작부터 종료까지 남아있는 영역 )
- 예시 :
import Foundation
print("HELLO")
- 위 코드 + 필요한 명령어들이 저장되는 공간.
- 당연히 컴퓨터가 이해할 수 있는 언어 컴피일된 기계어가 저장된다.
데이터 영역
- 전역 변수 (Global Variables), 정적 변수 (Static Variables), 상수 (Constant) 가 저장되는 영역
- 프로그램의 시작과 함께 할당, 종료되면 소멸.
힙 영역
- 런타임중 동적으로 할당된 데이터가 저장되는 곳
- 포인터를 통해 접근 (참조)
- 참조타입 (Reference Type)이 저장되는 영역
장점 | 단점 |
---|
메모리 크기에 제한이 없음 | 데이터 액세스가 상대적으로 느린편 |
개발자가 동적으로 제어할 수 있음 | 할당 해제 작업으로 인한 속도 저하 |
| 두 개 이상의 쓰레드에서 동시에 데이터 액세스 할 경우 경합이 발생하여 한쪽 쓰레드는 기다려야함. |
스택 영역
- 컴파일 타임에 크기가 결정된다. (빌드 시점)
- 함수 호출과 관련된 정보를 저장하는데 사용
- 함수가 호출될때 마다 , 로컬 변수, 매개 변수, 반환 주소, 기타 정보들이 스택에 저장된다. (Stack Frame)
- 함수 실행이 끝나면 해당 함수 관련 데이터는 스택에서 제거 된다.
- 스택은 후입선출 (LIFO) 구조 이다.
- 스택 영역이 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되기 때문
- Push Pop 으로 데이터 저장,인출
- 값타입이 저장되는 영역
장점 | 단점 |
---|
데이터 액세스가 상대적 빠른편 | 스택의 크기가 제한이 있음, OverFlow 날수 있음 (swift는 자세히는 모르겠음) |
Automatic Reference Counting (ARC)
- Head 영역의 객체의 대한 Strong Referenec(강한 참조) Count를 추척하고,
- 객체가 더 이상 필요하지 않을때, 해당 객체를 메모리를 자동으로 해제하는 방식으로 메모리를 관리
공부한 내용 링크