메모리는 주기억장치로 컴퓨터를 구성하는 핵심 부품 중 하나로 보통 RAM을 지칭합니다. 전원이 꺼지면 저장된 정보가 사라지는 휘발성 저장장치이며, Code, Data, Heap, Stack이라는 네 가지 영역으로 구성되어 있습니다. 이후 설명은 최대한 Swift를 기준으로 작성했습니다.
code 영역은 명령어가 기계어로 변환되어 저장되는 곳입니다.
컴파일 타임에 결정되며 코드가 중간에 바뀌지 않도록 Read-Only로 저장됩니다.
전역 변수, static 변수, 상수, Meta Data 등이 프로그램 시작과 종료 시 할당, 해제됩니다. code와 달리 Read-Write입니다.
static let name = "Eden" //static 변수
var colorSet: [Color] //전역 변수
let country = "Korea" //상수
Heap영역은 유일하게 런타임에 할당됩니다. 따라서 데이터 크기가 불확실할 때도 사용가능합니다.
또한 개발자가 직접 메모리를 할당/해제 하며 크기가 동적(Dynamic Memory Allocation)인 영역입니다. 따라서 개발자가 메모리를 해제하지 않을 시 memory leak이 발생합니다. 추가적인 특징은 다음과 같습니다.
class
, actor
와 같은 참조타입의 데이터가 저장된다.
Stack은 컴파일 시 할당됩니다. 때문에 Heap처럼 무한히 메모리를 할당받을 수 없습니다.
그리고 CPU에서 직접 관리와 최적화를 하기 때문에 속도가 빠릅니다.
추가적인 특징은 다음과 같습니다.
struct
, enum
등과 같은 값 타입의 데이터가 저장된다.struct
가 Protocol
을 준수하고 있거나 generic
을 가진 경우.struct Point { var x, y: Double } let point1 = Point(x: 0, y: 1) var point2 = point1 point2.x = 5
class Point { var x, y: Double init(x: Double, self.x = x self. y = y: Double) { } let point1 = Point(x: 0, y: 0) let point = point1 point2.x = 5
여기서 refCount는 활성참조를 나타내며 이것이 0이 된다면 스위프트가 해당 영역을 재활용하기 시작합니다.
추가적으로 앞서 언급했듯 Heap과 Stack은 모두 같은 메모리에 있으며 같은 영역을 나누어 가집니다. 때문에 한쪽이 과도하게 공간을 차지하려 한다면 overflow가 발생하게 됩니다.
https://www.sngular.com/insights/281/memory-management-in-swift
https://baegteun.tistory.com/9
https://varun04tomar.medium.com/open-nuts-and-bolts-of-memory-management-in-ios-swift-part-1-4927b60fccf8
https://medium.com/@ryabenko.ana/stack-vs-heap-in-swift-557c939d8cfc
https://babbab2.tistory.com/25