프로그램 실행 순서
프로그램의 정보를 읽어 메모리에 로드되는 과정을 시각화한 그림
프로그램이 실행하게되면 OS는 메모리(RAM)에 공간을 할당한다.
메모리 영역(구조)
할당해주는 메모리 공간은 Code, Data, Stack, Heap 총 4개
Code; 코드 영역
- 우리가 작성한 소스코드가 들어가는 부분
- 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 한다.
- 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 저장된다.
Data; 데이터 영역
- 전역 변수와 static 변수가 할당되는 영역
- 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸되는 영역
class Main {
static int a = 10; // 데이터 영역에 할당
static int b = 20; // 데이터 영역에 할당
public static void main(String[] args) {
...
}
}
Stack; 스택 영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이며 함수 호출이 완료되면 사라진다.
class Main {
// 전역변수 a와 b는 데이터 영역에 할당
static int a = 10;
static int b = 20;
public static void main(String[] args) {
...
}
// 매개변수 v1 와 지역변수 v2 는 스택 영역에 할당
public void func1 (int v1) {
int v2 = v1 + 1;
return v2;
}
}
Heap; 힙 영역
프로그래머가 할당/해제하는 메모리 공간
Java 에서는 GC 가 자동으로 해제한다.
힙 영역에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation) 이라고 한다.
예를 들어 클래스, 클로저가 이 부분에 해당된다. (클로저 추후 정리 필요)
런타임 시에 크기가 결정된다.
위 그림과 같이 Heap 과 Stack 영역은 사실 같은 공간을 공유한다. Heap이 메모리 위쪽(낮은 주소) 주소부터 할당되면 Stack은 아래쪽(높은 주소)부터 할당되는 식이다.
각 영역이 상대 영역을 침범하는 일이 발생할 때를 HEAP OVERFLOW, STACK OVERFLOW 라고 한다.