메모리 구조
- Clean Memory
- 페이지 아웃 가능한 데이터로, 메미로 매핑된 파일, 이미지, 프레임워크 등이 포함됩니다.
- 필요시 디스크에서 다시 로드할 수 있어 시스템에 의해 해제될 수 있습니다.
- Dirty Memory
- 앱에 의해 수정된 메모리로, 런타임 중 생성된 객체나 데이터 구조가 포함됩니다.
- 디스크와 동기화되지 않아 시스템이 쉽게 해제할 수 없습니다.
- Compressed Memory
- iOS 7부터 도입된 메모리 압축 기술을 통해 관리되는 메모리입니다.
- 접근되지 않은 페이지를 압축하여 공간을 절약하고, 필요시 다시 압축 해제합니다.
메모리 관리 방식
- Automatic Reference Counting (ARC)
- 컴파일 시점에 자동으로 retain/release 코드를 삽입하여 객체의 참조 횟수를 관리합니다.
- 참조 횟수가 0이 되면 객체를 자동으로 해제합니다.
- 메모리 경고 시스템
- 시스템 메모리가 부족해지면 앱에 메모리 경고를 보내 불필요한 리소스를 해제할 기회를 제공합니다.
- 샌드박스 모델
- 각 앱은 격리된 환경에서 실행되며, 자신의 메모리 공간만 접근할 수 있습니다.
- 메모리 압축
- 사용되지 않는 메모리 페이지를 압축하여 가용 메모리를 확보합니다.
- 앱 생명주기 관리
- 백그라운드 상태의 앱은 제한된 메모리만 사용할 수 있으며, 필요시 시스템에 의해 종료될 수 있습니다.
힙(Heap)과 스택(Stack)의 차이점
힙(Heap)과 스택(Stack)은 프로그램의 메모리 관리에 사용되는 두 가지 주요 메모리 영역입니다.
메모리 할당 방식
- 스택: 컴파일 시간에 크기가 결정되며, 함수 호출과 함께 자동으로 할당 및 해제됩니다.
- 힙: 런타임에 동적으로 할당되며, 프로그래머가 직접 관리해야 합니다.
접근 속도
- 스택: 메모리 할당이 연속적으로 이루어져 접근 속도가 빠릅니다.
- 힙: 메모리 할당이 불연속적이어서 스택에 비해 접근 속도가 느립니다.
메모리 관리
- 스택: 컴파일러가 자동으로 관리하여 메모리 누수 위험이 적습니다.
- 힙: 프로그래머가 직접 할당 및 해제를 관리해야 하며, 메모리 누수의 위험이 있습니다.
크기 제한
- 스택: 일반적으로 크기가 제한되어 있어 대용량 데이터 저장에 부적합합니다.
- 힙: 사용 가능한 메모리 한도 내에서 크기 제한이 없어 대용량 데이터 저장에 적합합니다.
데이터 수명
- 스택: 함수 호출이 끝나면 자동으로 메모리가 해제됩니다.
- 힙: 프로그램 실행 중 언제든 할당 및 해제가 가능하며, 명시적으로 해제하지 않으면 프로그램 종료 시까지 유지됩니다.
사용 목적
- 스택: 지역 변수, 함수 매개변수, 함수 호출 정보 등 임시 데이터 저장에 사용됩니다.
- 힙: 동적으로 할당되는 객체, 큰 데이터 구조 등 장기간 유지되어야 하는 데이터에 사용됩니다.