JVM(Java Virtual Machine)
JVM, 자바 가상 머신은 자바를 실행하기 위한 가상 기계를 의미한다.
가상 기계는 소프트웨어로 구현한 물리적인 컴퓨팅 환경을 의미한다.
가상 기계에 대해 더 자세히 알고 싶다면, 2025.08.27 - [Development/개발 공부] - 가상 머신(VM, Virtual Machine) 를 참고하면 된다.

다음은 자바 애플리케이션이 실행되는 과정을 도식화한 것이다.
1) MyProgram.java라는 자바 소스 코드가 존재할 때,
2) 컴파일러는 이 소스 코드를 컴파일하여 바이트코드로 이루어진 MyProgram.class 파일을 생성한다.
3) 컴파일된 중간 파일은 JVM 위에서 CPU가 이해할 수 있는 기계어로 변환되고, 실제 연산을 수행한다.
JVM의 동작 방식
그렇다면 컴파일된 중간 파일이 어떻게 기계어로 변환될까?
JVM의 구조를 살펴보자.

JVM은 클래스 로더, 실행 엔진(JIT, Interpreter, Garbage Collector), 런타임 데이터 영역(Method, Heap, ...)으로 이루어져 있다.
클래스 로더(Class Loader)
클래스 로더는 컴파일된 바이트코드 파일을 JVM 내 메모리(런타임 데이터 영역)에 동적으로 배치하는 역할을 한다.

세부 과정으로는,
- JVM에 바이트코드 파일을 적재(Loading)한다.
- 적재한 바이트코드 파일에 대해 연결(Linking) 작업을 수행한다.
→ 바이트코드의 유효성을 검증(Verification) 한다.
→ JVM의 메모리(method 영역)에 static 변수의 공간을 할당 및 기본값으로 초기화하고(Preparing),
→ 파일의 참조 대상을 메모리 주소로 변환한다(Resolving). - 바이트코드 파일 내 static 변수들을 초기화(Initialization)한다.
실행 엔진(Execution Engine)
실행 엔진은 적재된 중간 바이트코드 파일을 명령어 단위로 읽어서 실행한다.
명령어를 실행하는 방식은 인터프리터, JIT 컴파일러 두 가지 방식이 있다.
인터프리터(Interpreter)
인터프리터 방식은 바이트코드 명령어를 한 줄씩 읽어 연산을 수행하는 방식이다.
동일한 명령어도 반복해서 실행하기 때문에 전체 실행 속도가 느린 편이다.
JIT 컴파일러
JIT 컴파일러는 실행 도중 반복되는 바이트코드가 있을 경우, 해당 명령어를 네이티브 코드(기계어)로 변환해 캐싱한다.
나중에 해당 명령어가 나오면 캐시에 저장된 네이티브 코드를 가져와 실행한다.
❗️ 실행 엔진은 인터프리터와 JIT 컴파일러를 혼합하여 사용한다.
명령어를 한 줄씩 실행하다, 자주 반복되는 명령어가 있다면 네이티브 코드로 변환해 캐싱하고 이후에 캐시된 코드를 실행한다.
가비지 콜렉션(Garbage Collection)
JVM은 Heap 영역 내에서 더 이상 참조되지 않는 객체를 찾아 제거하는데, 이를 가비지 콜렉션이라고 한다.
가비지 콜렉션에 대해 더 자세히 알고 싶다면, 2025.07.21 - [CS/운영체제] - [OS] GC(Garbage Collection, 가비지 컬렉션) 를 참고하면 된다.
런타임 데이터 영역(Runtime Data Area)
런타임 데이터 영역은 JVM의 메모리 영역으로, 자바 애플리케이션 실행 시 필요한 데이터들이 저장되는 공간이다.
런타임 데이터 영역은 크게 5가지로 나뉜다.
Method Area(메소드 영역)
중간 바이트코드 파일의 클래스 정보와 초기화 대상(static 변수 등)을 저장하는 영역
※ 클래스 정보: 클래스 종류(클래스 or 인터페이스), 상수 데이터, 상속 정보 등
Heap Area(힙 영역)
객체가 생성되고, 가비지 컬렉션(GC)의 대상이 되는 동적 영역
PC Register(PC 레지스터)
햔제 실행 중인 JVM 명령어의 주소를 저장하는 영역
JVM Stack
각 메소드 호출 시 생성되는 스택 프레임에 지역 변수, 중간 연산 결과 등을 임시 저장하는 영역
Navite Method Stack
자바가 아닌 "C, C++ 등 외부 네이티브 코드"로 작성된 메서드가 실행될 때 사용되는 스택 영역
→ 자바로 작성된 네이티브 코드는 JVM Stack에서 실행된다.
결론적으로, JVM은
- 자바 소스 코드를 컴파일하여 생성된 바이트코드 형태의 중간 파일을 메모리에 적재하고,
- 적재된 바이트코드를 해석하고 실행하여 자바 애플리케이션이 어느 OS에서도 동작할 수 있도록 하는 역할을 한다.
:)
출처
https://www.realjavaonline.com/java-virtual-machine/class-loader-page.php
https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca
'Java' 카테고리의 다른 글
| [Java] 제네릭(Generic) (0) | 2025.10.06 |
|---|---|
| [Java] 인터페이스 vs 추상 클래스 (0) | 2025.10.03 |
| [Java] final vs static vs static final (0) | 2025.09.22 |
| [Java] LocalDate / LocalTime / LocalDateTime 클래스 (2) | 2025.06.06 |
| [Java] Date 클래스 (0) | 2025.06.04 |