![iOS에서의 메모리 구조와 관리 방식](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbNnQ1%2FbtsGOJjie3B%2FjjalTt5g2VbUndWklcBYW1%2Fimg.jpg)
iOS 앱의 메모리 구조와 각 영역의 특징
메모리 공간은 4가지 영역으로 구성되어 있다.
- 코드 영역
- 데이터 영역
- 힙 영역
- 스택 영역
코드 영역
- 텍스트 영역이라고도 하며, 프로그램을 구성하는 실행 가능한 기계어 코드로 저장
- 컴파일 과정에서 생성되며, 대부분의 운영체제에서는 읽기 전용으로 되어 있어 코드 불변성
- 코드 실행을 위해 필수적인 것을 보호되는 것으로 커널, 프로그램, 라이브러리 코드 등 텍스트로 저장
데이터 영역
- 전역 변수와 정적 변수를 저장하는 영역
- 앱 실행 시 할당되고 앱 종료 시 해제되며, 읽기 쓰기가 가능
- 정의된 초기값으로 설정되어 앱 모든 코드에서 접근이 가능
힙 영역
- 동적으로 할당된 메모리를 저장하는 영역
- 런타임 시에 필요한 메모리를 확보하는데 사용
- 메모리 크기 제한 없음
- 느린 속도
- 모든 스레드에서 공유로 안전성 필요
- 참조 형식으로 메모리가 사용되지 않는 경우 해제
스택 영역
- LIFO 구조로 함수 호출과 관련된 데이터를 저장하는 영역
- 함수 호출 시 지역 변수, 매개변수, 리턴 값 등이 저장되며, 함수가 종료되면 메모리가 해제
- 컴파일 타임에 결정되며, 메모리 크기에 제한
- 구조체 및 열거형과 같은 값 형식을 저장
- CPU에서 효율적으로 구성하여 매우 빠른 속도
- 각 스레드에는 자체 스택이 존재
iOS에서는 힙 또는 스택에 메모리를 자동으로 할당한다.
재귀 형식의 코드로 너무 많은 메모리를 할당하면 스택 오버 플로우로 앱을 죽는다.
혹은 순환 참조가 발생한 경우에도 메모리 누수가 발생하여 앱이 죽을 수 있다.
힙 영역에서 객체가 어떻게 할당되고 관리되는지
참조 타입은 힙 영역에 할당된다. Swift에서 참조 타입으로는 클래스, 클로저, 프로토콜 등이 있다.
하지만 struct 같은 경우에도 내부적으로 힙 영역에 할당될 수 있다.
UIFont와 같은 class로 되어 있는 것은 인스턴스에 생성하는 시점에 참조된다.
값 타입인 경우에도 3 words가 넘어가면 실존 타입으로 값 전체가 힙 영역에 할당 후 복사된다.
ARC를 통해 레퍼런스 카운트를 통해 사용에 따라 개수가 올라가고 내려간다. 카운트가 0이 될 때 해제 되도록 만들어져 있다.
스택 영역에서 함수 호출과 로컬 변수의 메모리 할당 및 해제 과정
함수 호출 시 지역 변수, 매개변수, 리턴 값이 저장되며, 함수가 종료되면 메모리가 해제된다.
함수 내 다른 함수를 호출했다면, 마지막 함수가 값을 반환 할 때까지 함수는 다른 함수가 종료될 때까지 메모리 해제를 기다리게 된다.
하지만 스택 영역에서는 한정된 크기로 재귀 형식으로 메모리가 쌓이게 되면 스택 오버 플로우가 발생한다.
그리고 함수가 종료되면 변수의 값들은 메모리가 해제된 상태로 접근할 수 없게 된다.
추가
2023.08.12 - [Swift] - ARC, Reference Count 그리고 optional unowned (with WWDC21 ARC in Swift)
ARC, Reference Count 그리고 optional unowned (with WWDC21 ARC in Swift)
Automatic Reference Counting 앱의 메모리 사용량을 추적하고 관리합니다. 대부분의 경우, 메모리 관리는 Swift에서 작동 한다는 것을 의미하며 메모리 관리를 직접 생각할 필요가 없습니다. 해당 인스턴
raidho.tistory.com
2023.08.02 - [Swift] - [WWDC16] Understanding Swift Performance (1)
[WWDC16] Understanding Swift Performance (1)
WWDC16에서 발표한 Understanding Swfit Performace Understanding Swift Performance - WWDC16 - Videos - Apple Developer In this advanced session, find out how structs, classes, protocols, and generics are implemented in Swift. Learn about their relative.
raidho.tistory.com
'Life style > TIL' 카테고리의 다른 글
iOS에서 메모리 사이즈와 관련된 개념과 고려 사항 (0) | 2024.04.29 |
---|---|
네트워크 프로토콜 스택과 iOS에서의 네트워크 통신 방식 (0) | 2024.04.24 |
운영체제 역할과 iOS 운영체제 구조: Process, Thread, ARC, Sandbox (0) | 2024.04.16 |
CPU Architecture: RISC vs CISC (0) | 2024.04.15 |
캐시 메모리의 개념과 종류, 역할 (0) | 2024.04.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!