이 영역들을 하나씩 자세히 알아보도록 하겠습니다.
실행할 프로그램의 코드가 저장되는 곳으로 수정이 불가능한 기계어로 저장되어 있어 정적인 특징이 있습니다.
전역변수와 정적변수가 저장되어 있으며, 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸되는 특징이 있습니다. 여기서의 데이터 영역들은 두개의 영역으로 나누어 집니다.
사실 데이터 영역은 ROM에 위치하는데,
전역변수와 static 변수를 ROM에 저장하면 런타임 시 변경된 값이 적용되지 않고, 계속 초기값만을 가지고 있게 됩니다.
(ROM은 read only니까!)
그래서 데이터 영역을 RAM에 복사해서 런타임 시 변경되는 값을 저장할 수 있도록 한다고 합니다.
여기서 BSS와 Data 영역을 나누는 이유는?
초기화 된 데이터는 ROM의 data 영역에 저장된다. 하지만 초기화되지 않은 데이터들까지 ROM에 저장하면 너무 많은 비용이 소모되므로 RAM과 ROM에 저장할 데이터를 구분하기 위해 영역을 구분해 사용한다.
정적으로 할당한 메모리 영역으로 원시 타입의 데이터가 값과 함께 할당하는 특징을 가지고 있습니다.
즉, 함수 호출 시 할당되며 실행이 끝나면 메모리에서 해제되며 작동되는 특징은 아래와 같습니다. (프로그램이 사용하는 임시 메모리 영역 정도로 생각)
함수 호출 시 스택에 push 되고, return을 하면 스택에서 pop
할당과 해제를 반복하기 때문에 데이터의 용량이 불확실하다는 특징을 가지고 있으며,
이렇게 스택 영역에 저장된 함수 호출 정보를Stack Frame
이라고 합니다.
여기서 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 변경될 수 있으므로, 이때 힙과 스택의 메모리 영역이 겹치면 안되기 때문에 힙과 스택 사이의 공간을 비워 놓습니다.
동적으로 할당한 메모리 영역 으로 모든 object타입의 데이터가 할당되며 heap영역의 object를 가리키는 참조 변수가 stack에 할당되는 특징을 가지고 있습니다.
메모리 주소 값에 의해서만 참조되고 사용되는 영역으로
Java의 경우 가비지 콜렉터가 관리하는 영역으로class
,clouser
와 같은 참조 타입의 데이터가 저장됩니다.