Open kmh5038 opened 8 months ago
iOS의 메모리 구조와 관리 방식에 대해 알아보려한다.
프로그램이 실행되면 OS가 메모리 공간을 할당해주는데 Code, Data, Heap, Stack
4개로 나뉜다.
우리가 작성한 소스코드가 저장
되는 영역이다.
컴파일 타임
에 결정된다.Read-Only
로 저장된다프로그램 어디서든 사용될 가능성
이 있는 전역변수와 static변수
가 저장된다.
컴파일 타임
에 결정된다.시작과 동시에 할당
되며 프로그램이 종료되어야 메모리가 해제
된다.Read-Write
로 저장된다.데이터 크기가 확실하지 않은
가변적인 데이터 타입들이(런타임 시 결정되기 때문에 데이터크기가 확실하지않음) 저장되는 영역이다. 클래스 인스턴스나 클로저 등 참조 타입들이 주로 할당되지만, 값타입도 할당은 가능하다.
런타임
에 결정된다.메모리 크기에 대한 제한이 없다
. 그래서 “자유 저장 영역” 혹은 “동적 메모리 영역”이라 불린다.범위가 전역
이기 떄문에, 프로그램의 모든 함수에서 엑세스
할 수 있다.스레드들이 공유하는 영역
이기 때문에,힙 경합(두 개 이상의 쓰레드가 동시에 접근하려 할 때)이 발생할 수 있다. → 속도 저하 유발, thread-safety X메모리를 직접 관리해야한다
. 메모리 해제를 해주지 않으면 메모리 누수가 발생
한다. → Swift의 경우 ARC를 통해 자동으로 해제를 관리해준다.함수의 호출과 관련된 지역변수,매개변수,리턴 값
들이 저장되는 영역이다.
컴파일 타임
에 결정된다.후입선출 LIFO
(Last In,First Out)방식으로 동작한다.CPU에서 관리
하고 최적화 하기 때문에 속도가 매우 빠르다
.함수가 종료되면 메모리도 자동으로 해제
된다.메모리 크기에 제한
이 있다.지역 변수만 액세스
가능하다.Stack
은 메모리가 한정
되어 있기 때문에 너무 큰 메모리는 할당할 수 없다
.
데이터의 크기를 모르거나, Stack에 저장하기엔 큰 데이터의 경우엔 Heap에 할당 하고 그 외엔 Stack에 할당하면 된다. (인스턴스, 클로저 등 자동으로 Heap에 할당되는 것 외에 직접 할당할 경우) 만약 Stack에 너무 많은
메모리를 할당하게 되면 Stack overflow
가 발생한다.
Stack overflow?
스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우,
iOS에서 Stack over flow 발생 시 앱이 crash된다.
변수는 Stack에 저장되고, 그 변수는 Heap의 주소 값을 갖는다.
클래스 인스턴스를 Heap에 저장하려면 어디에 저장할지 찾아야 하고 멀티 스레드 환경에서 Locking, 해제과정 등 시간이 소요되기 때문에 클래스를 사용하는것은 Stack에 저장되는 구조체를 사용하는 것보다 오래 걸린다.
클래스와 구조체 두개 다 사용 가능한 경우, 구조체를 사용하는것을 권장하고 상속이나 참조와 같은 클래스만의 기능을 사용해야 할 경우 클래스를 이용한다.
Heap과 Stack 같은 메모리 영역을 공유한다.
같은 메모리 공간에서 힙 영역은 낮은 메모리 주소부터 할당받고,
스택 영역은 높은 메모리 주소부터 할당 받는 것이다.
따라서 힙 또한 자신의 영역 외로 확장하려다 보면 Heap overflow
가 발생한다.
컴파일타임, 런타임에 결정된다는게 정확히 어떤 의미인가요?
클래스 인스턴스를 Heap에 저장하려면 어디에 저장할지 찾아야 하고 멀티 스레드 환경에서 Locking, 해제과정 등 시간이 소요되기 때문에 클래스를 사용하는것은 Stack에 저장되는 구조체를 사용하는 것보다 오래 걸린다.
클래스와 구조체 두개 다 사용 가능한 경우, 구조체를 사용하는것을 권장하고 상속이나 참조와 같은 클래스만의 기능을 사용해야 할 경우 클래스를 이용한다.
클래스가 기본적으로 Heap 영역에 저장 ( == 런타임에 실행 ) 되는 이유는 Reference 타입이라 그런걸로 알고 있어요. ( 오버라이딩이 될 가능성이 있기 때문 )
구조체의 경우도 Stack 의 영역에서 벗어나는 경우가 있나요..?
class 가 내부에서 아무것도 갖지 않고, extension 에서 메서드를 갖고 있다면 오버라이딩이 불가능하다고 알고 있는데.. 이럴때는 어느 영역에서 저장이 될까요..?