프로그램 실행 순서
프로그램의 실행을 위해서는 먼저 프로그램이 메모리에 로드가 되어 있어야한다.
프로그램을 실행하면 os 는 메모리에 공간을 할당하게 된다.
프로그램의 실행 순서는 아래와 같다.

메모리 구조
메모리 공간은 다음과 같은 영역으로 나누어진다.
1. 코드(code) 영역
2. 데이터(data) 영역
3. 스택(stack) 영역
4. 힙(heap) 영역

1. 코드(code) 영역
메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
2. 데이터(data) 영역
메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 모든 쓰레드가 공유하게된다. 프로그램이 종료되면 소멸한다.
3. 힙(heap) 영역
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는, 즉 동적할당 된 메모리 영역이다. JAVA에서는 GC가 자동으로 해제한다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정하게 되고 이렇게 런 타임에 메모리를 할당받는 것을 메모리의 동적 할당(dynamic allocation)이라고 한다.
동적 할당은 런타임에 주소가 정해지기 때문에 어디에 특정 데이터가 있는지 알 수가 없다. 그래서 스택에 쌓이게 되는 데이터에 포인터 혹은 참조형으로 주소값을 저장하여 특정할 수 있게 하는 것이다.
4 스택(stack) 영역
메모리의 스택(stack) 영역은 함수의 호출과 함께 지역 변수와 매개변수가 저장되며, 함수의 호출이 완료되면 소멸한다.
프로그램이 자동으로 사용하는 임시 메모리 영역이다.
스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출되고 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
위의 HEAP과 STACK영역은 사실 같은 공간을 공유하고 있으며 Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아지는 방식이다.
HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되어 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭한다.