프로그램 실행 순서 프로그램 실행 순서
메모리의 구조
사용자가 프로그램을 실행하면 운영체제(OS)는 먼저 프로그램을 메모리(RAM)에 로드(load) 한다.
이때 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
OS는 코드(code) / 데이터(data) / 스택(stack) / 힙(heap) 4영역에 프로그램에서 사용되는 변수들을 저장 할 메모리를 할당 한다.
코드(Code) 영역
메모리의 코드 영역은 우리가 작성한 소스코드가 들어가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.
실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 저장된다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
데이터(Data) 영역
메모리의 데이터영역은 프로그램의 전역변수와(인스턴스변수) 정적변수(static)가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램 종료시까지 존재한다.
스택(Stack) 영역
메모리의 스택영역은 호출된 메서드의 작업에 관계되는 지역변수와 매개변수가 저장되는 영역이다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
스택은 후입선출(=선입후출) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
컴파일시 크기가 결정된다.
힙(Heap) 영역
메모리의 힙영역은 프로그래머가 직접 할당/해제 할 수 있는 메모리 영역이다.
Java에서는 가비지 컬렉터가 사용되지 않는 데이터를 자동으로 해제한다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
위의 HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 부터, STACK은 아래쪽부터 할당되는 방식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭한다. Stack 영역이 커지면 Heap 영역이 작아지고, Heap 영역이 커지면 Stack 영역이 작아진다.
'Java' 카테고리의 다른 글
[자바의 의존성] 의존성과 라이브러리, 그리고 jar (0) | 2020.05.13 |
---|---|
[자바의 의존성] 메이븐과 의존성 관리도구 (0) | 2020.05.13 |
부동소수점과 그 한계. (0) | 2020.05.13 |
기계어와 어셈블리언어 고급언어. (0) | 2020.05.13 |
절차지향 언어와 객체 지향 언어의 차이는? (0) | 2020.05.13 |