메모리는 Code ,Data , Heap , Stack 영역으로 이루어짐.
Code
우리가 작성한 소스코드가 기계어 형태로 저장
컴파일 타임에 결정되고,
중간에 코드가 변경되지 않도록 Read-Only 형태로 저장
Data
전역변수, Static 변수가 저장
프로그램 시작과 동시에 할당
프로그램이 종료되어야 메모리가 해제
실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정
Heap
프로그래머가 할당/해제하는 메모리영역
malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 ‘동적 할당’이라고 함
클래스 인스턴스, 클로저 같은 참조타입의 값들은 힙에 자동 할당
사용하고 난 후 반드시 메모리 해제를 해줘야한다.
그렇지 않으면? memory leak이 발생
유일하게 런타임 시 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용
장점: 메모리 크기에 대한 제한 없음
본질적인 범위가 전역이기 때문에 프로그램의 모든 함수에서 엑세스 할 수 있음
단점: 할당,해제 작업으로 인한 속도저하
힙 손상(이중 해제, 해제 후 사용 등)으로 인한 속도저하
힙 경합(두 개 이상의 쓰레드가 동시에 접근하려 할때 Lock이 걸림)으로 인한 속도저하
메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)
Stack
함수 호출 시 함수의 지역변수, 매개변수, 리턴값 등등이 저장되고,
함수가 종료되면 저장된메모리도 해제된다.
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.
프로그램이 자동으로 사용하는 임시 메모리 영역 LIFO구조(먼저 생성된 변수가 가장 나중에 해제됨)
장점: CPU가 스택 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
메모리를 직접 해제를 해주지 않아도 됨
단점: 메모리 크기에 대한 제한있음
지역 변수만 엑세스 가능
힙vs스택
스택은 메모리가 한정되어 있기 때문에 너무 큰 메모리는 할당할 수 없음
데이터의 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우엔 힙에 할당
그 이외에는 스택에 할당
스택에 너무 많은 메모리를 할당하게되면?
스택오버플로우 발생
스택오버플로우란, 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우를 말함
힙과 스택의 메모리 관계
힙과 스택은 같은 메모리 영역을 공유함
같은 메모리 공간이지만,
힙 영역은 낮은 메모리 주소부터 할당 받고,
스택 영역은 높은 메모리 주소부터 할당 받음
힙 영역 또한 자신의 영역 외로 확장하려다 보면, 힙 오버 플로우 발생