<!-- iOS 개발자로 성장하고 있는 제 Github 스터디 레포지토리로 놀러오세요 -->
iOS 메모리 구조 (Code, Data, Stack, Heap)
- 메모리 구조프로그램이 실행되면 운영체제는 메모리(RAM)에 프로그램을 위한 공간을 할당해 준다.
- 코드영역
- 작성한 소스코드가 기계어 형태로 저장된다.
- 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only의 형태로 저장된다.
- 데이터 영역
- 전역 변수, static 변수가 저장된다.
- 프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 해제된다.
- 실행 도중 변수 값이 변경될 수 있으니 Read-Write로 저장된다.
- 힙 영역
- 프로그래머가 할당/해제하는 메모리 영역
- 프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당'이라고 부른다.
- 사용한 후에는 메모리 해제를 반드시 해주어야 한다. 그렇지 않으면 메모리 누수가 발생한다. (Memory leak)
- Code, Data, Stack 중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.
- Class instance, Closure 같은 "참조 타입"의 값들은 모두 힙에 자동 할당 된다.
- 그러나 우리는 위의 값들을 사용하고도 메모리 해제를 해준 적은 없다.
- 왜?
- Swift의 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모없어지면 (참조되지 않으면) 자동으로 해제해주기 때문이다.
- 장점 :
- 메모리 크기에 대한 제한이 없다.
- 본질적 범위가 전역이기 때문에 프로그램의 모든 함수에서 엑세스 가능하다.
- 단점 :
- 할당, 해제 작업으로 인한 속도 저하
- 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
- 힙 경합 (이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
- 메모리를 직접 관리해야 함 (해제해주지 않으면 메모리 누수 발생)
- 스택 영역
- 함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등이 저장되고 함수가 종료되면 저장된 메모리도 해제된다. 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
- 스택은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 스택 영역은 Last in First out 데이터 구조이고 CPU에 의해 관리되고 최적화되어 속도가 매우 빠르다.
- 직접 메모리를 해제해 줄 필요가 없다.
- 메모리 크기에 대한 제한이 있다. / 지역 변수만 엑세스할 수 있다.
- 코드영역
- 그리고 그 공간은 총 4가지 코드영역, 데이터 영역, 힙 영역, 스택 영역으로 구분할 수 있다.
- 힙 VS 스택
- 언제 힙을 쓰고 언제 스택을 쓰나?
- 스택은 메모리가 한정되어 있기 때문에 데이터의 크기를 모르거나 스택을 저장하기에는 큰 데이터의 경우에는 힙에 할당하고 그 외엔 스택에 할당하면 된다.
- 스택에 너무 많은 메모리를 할당하게 되면 Stack overflow가 발생한다.
- 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우
- 힙과 스택의 메모리 관계
- 힙과 스택은 같은 메모리 영역을 공유한다.
- 힙은 낮은 메모리 주소부터 할당받고, 스택 영역은 높은 메모리 주소부터 할당받는다.
- 따라서 힙 또한 자신의 영역 외로 확장하려다 보면 힙 오버 플로우가 발생한다.
- 언제 힙을 쓰고 언제 스택을 쓰나?
Reference : https://babbab2.tistory.com/25
함께 읽어보면 좋을만한 자료 : https://babbab2.tistory.com/26?category=831129
반응형
'📱 Mobile > 🌠 iOS' 카테고리의 다른 글
[IOS] Alamofire 사용하기! - (1) (0) | 2021.06.16 |
---|---|
[iOS 면접 준비] 앱이 foreground에 있을 때와 background에 있을 때의 제약사항 (0) | 2021.05.31 |
[iOS 면접 준비] 실제 디바이스가 없을 경우 (0) | 2021.05.31 |
[iOS 면접 준비] Bounds와 Frame의 차이점은? (0) | 2021.05.31 |
[iOS] Navigation Bar Title 변경 (0) | 2021.03.09 |