
작성한 소스 코드가 기계어 형태로 저장된다.
컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장된다.
전역변수, static 변수가 저장된다.
프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리가 해제된다.
실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다.
[추가 확인 필요] Swift에서는 static의 기본 동작이 lazy로 값을 처음 접근할 때 할당되므로, 바로 메모리에 올라가진 않을 수 있다.
프로그래머가 할당/해제하는 메모리 영역
프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당'이라고 한다.
메모리를 사용한 이후에는 반드시 메모리 해제를 해줘야 한다.
그렇지 않으면 memory leak이 발생한다.
Code, Data, Stack 외 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.
Swift에서는 클래스 인스턴스와 클로저 같은 참조 타입의 값을 통해 힙 영역에 자동 할당된다. 메모리 해제는 ARC를 통해 힙에 할당된 메모리가 사용되지 않으면(참조되지 않으면) 자동으로 해제된다.
함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등등이 저장되고, 함수가 종료되면 저장된 메모리도 해제된다.
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
힙을 사용하는 경우는 데이터의 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우에 사용한다. 그 외에는 스택에 할당하면 된다.
만약에 스택에 너무 많은 메모리를 할당하게 되면 스택 오버 플로우가 발생한다.
기본적으로 힙과 스택은 같은 메모리 영역을 공유한다.
힙은 낮은 메모리 주소로부터 할당받고,
스택은 높은 메모리 주소로부터 할당 받는다.
힙도 자신의 영역외로 확장하면 힙 오버 플로우가 발생한다.
출처: 개발자 소들이님의 블로그
https://babbab2.tistory.com/25