자바프로그램의 동작과정
모든 자바 프로그램은 자바 가상머신(JVM)을 통해 실행된다
자바 프로그램이 실행되면 JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.
메소드 영역
메소드 영역은 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수가 저장되는 여역
JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장
힙영역
자바프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역
JVM은 자바 프로그램에서 new 키워드를 사용해 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됨
스택영역
자바 프로그램에서 메소드가 호출될 때, 메소드의 스택프레임이 저장되는 여역
JVM은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장한다
이렇게 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸한다
스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임(stack frame)이라고 한다.
LIFO(last-in first-out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됨
스택영역은 높은 메모리 주소에서 낮은 주소의 방향으로 할당됨.
JVM의 전체적인 구조
- Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. (컴퓨터가 이해할 수 있는 코드로 변환)
- Byte Code로 변환된 파일을 JVM의 Class Loader 로 보낸다.
- Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 한다.
- Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진이다.
- Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다.
- Runtime Data Area (
Memory Area
) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.
Java Memory Area의 구조
- Method Area
- JVM이 실행되면서 생기는 공간이다.
- Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
- Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
- 모든 스레드에서 정보가 공유된다.
- Heap
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
- Reference Type 의 데이터가 저장되는 공간
- 모든 스레드에서 정보가 공유된다.
- Stack
- 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
- Last In First Out, 나중에 들어온 데이터가 먼저 나간다
- 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- 스레드마다 하나씩 존재한다.
- PC Register
- 스레드가 생성되면서 생기는 공간
- 스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
- JVM이 실행하고 있는 현재 위치를 저장하는 역할
- Native Method Stack
- Java 가 아닌 다른 언어 (C, C++) 로 구성된 메소드를 실행이 필요할 때 사용되는 공간