-
[ ] Java Compiler
Java Source파일을 JVM이 해석할 수 있는 Java Byte Code로 변환한다.
-
[ ] class Loader
Loading → .class 파일을 Load한다. (byte code를 class 또는 interface로 만드는 프로세스)
Linking → Loading 이후 JVM Runtime Data Area의 올리는 역할을 한다.
Initialization → 적재된 클래스 또는 인터페이스를 초기화 합니다.
-
[ ] Execution Engine
Loading된 클래스의 Bytecod를 해석(Interpret)한다.
이 과정에서 Bytecode가 BinaryCode로 변환된다.
-
[ ] Runtime Data Area
JVM이 프로세스로서 수행되기 위해 OS로 부터 할당받는 메모리 영역이다.
저장 목적에 따라 5개로 나눌수 있다.
- Method Area
→ 모든 Thread에 공유 된다.
클래스 정보, 변수 정보, Method정보, static변수 정보, 상수정보 등이 저장 된다.
- Heap Area
→ 모든 Thread에 공유 된다.
new 명령어로 생성된 인스턴스와 객체가 저장되는 구역,
저장 공간이 부족해지면 GC가 실행된다.
- Stack Area
→ 각 Thread 마다 하나씩 생성된다.
Method 안에서 사용되는 값들(매개변수, 지역변수, 리턴 값 등등..)이 저장되는 구역,
메소드가 호출될 떄 LIFO 방식으로 쌓이고 지워진다.
- PC Register
→ 각 Thread 마다 하나씩 생성된다.
CPU의 Register 역할이 비슷하다.
현재 수행 중인 JVM 명령의 주소값이 저장된다
- Native Method Stack
→ 각 Thread 마다 하나씩 생성된다.
다른 언어의 메소드를 호출을 위해 할당되는 구역 언어에 맞게 Stack이 형성되는 구역이다.
JNI라는 표준 규약을 제공한다.