JVM(Java Virtual Machine)
- 가상 머신이란 프로그램을 실행하기 위해 물리적인 머신과 유사한 머신을 소프트웨어로 구현한 것
- 즉, 여러가지의 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는 것
- JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것
JVM의 특징
- 컴파일된 바이트 코드(.class파일)를 기계가 이해할 수 있는 기계어로 변환
- 스택 기반의 가상 머신
- 메모리 관리와 GC를 수행
JVM 구조
클래스 로더(Class Loader)🚚
JVM으로 class(바이트 코드)를 불러와서 메모리영역에 저장
실행 엔진(Execution Engine)📇
.class파일과 같은 바이트 코드를 기계어로 번역해 실행
인터프리터(Interpreter)
운영체제가 읽은 바이트 코드를 기계어로 번역
JIT 컴파일러(Just-In-Time Compiler)
인터프리터의 효율을 높이기 위한 컴파일러
- 인터프리터가 반복되는 코드를 발견하면, JIT 컴파일러가 반복되는 코드를 네이티브 코드로 바꿔줌
GC(Garbage Collector)🗑️
Heap 영역에 참조되지 않는 객체들을 제거해주는 모듈
메모리 영역(Runtime Data Area)🗂️
운영체제로부터 JVM이 할당받은 메모리 영역
- 런타임 시, 클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳
PC Register
Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있음
- JVM은 스택 기반의 가상 머신으로, CPU에 직접 접근하지 않고 Stack에서 주소를 가져와 PC Register에 저장
Stack Area
지역 변수, 파라미터 등이 저장되는 영역
- 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됨
Heap Area
동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 GC의 대상 영역
Method Area
클래스 정보를 처음 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 영역
- 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등
- 상수 풀(Constant Pool)은 모든 Symbolic Reference를 포함
JVM의 실행방식
- 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킵니다.
- Class Loader를 통해 class 파일들을 JVM으로 로딩합니다.
- 로딩된 class파일들은 Execution engine을 통해 해석됩니다.
- 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어집니다
단계별 산출물
개발자가 읽을 수 있는 Java 코드들(.java 파일)
(컴파일러 후)
운영체제가 읽을 수 있는 바이트 코드(.class 파일)
(실행엔진 후)
기계가 읽을 수 있는 기계어