JVM
JVM
JVM
1. JVM이란?
JVM (Java Virtual Machine)은 자바 프로그램을 OS와 무관하게 실행할 수 있도록 만들어주는 가상 머신(Virtual Machine) 이다.
- 자바는 소스코드를 컴파일하면 바이트코드 (.class) 를 생성
- 이 바이트코드는 JVM 위에서 실행된다
- 따라서 한 번 작성한 코드가 다양한 플랫폼에서 동작할 수 있음
슬로건: “Write Once, Run Anywhere”
2. JVM의 전체 실행 흐름
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[.java 소스 코드]
↓ (컴파일)
[javac 컴파일러]
↓
[.class 바이트코드]
↓
[Class Loader]
↓
[Runtime Data Area (JVM 메모리)]
↓
[Execution Engine]
↓
[실제 실행 결과]
위의 다이어그램은 JVM의 전체적인 다이어그램이다. CLass Loader 부터 하나하나씩 어떠한 역할을 하는지 알아보자 😛
3. Class Loader
JVM은 클래스 파일을 Class Loader를 통해 메모리에 적재한다. 이 모듈은 클래스를 읽어들이고 준비시키는 단계다.
Class Loader의 동작 과정
| 단계 | 설명 |
|---|---|
| 로딩 (Loading) | .class 파일을 읽고 Method Area에 클래스 정보 저장 |
| 링크 (Linking) | 검증 → 준비(static 메모리 확보) → 심볼릭 참조 해결 순서대로 진행 |
| 초기화 (Initialization) | static 필드 값 설정, static 블록 실행 등 초기 실행 준비 |
Class Loader 계층 구조
1
2
3
4
5
6
7
8
Bootstrap ClassLoader
↓
Extension ClassLoader
↓
Application ClassLoader
↓
Custom ClassLoader (선택)
| Class Loader | 설명 |
|---|---|
| Bootstrap | JVM 내부 핵심 클래스 로딩 (java.lang., java.util.) |
| Extension | lib/ext 폴더에 위치한 확장 클래스 로딩 |
| Application | 사용자 애플리케이션 클래스 로딩 (classpath 기반) |
| Custom | 직접 구현하여 동적 로딩, 보안 기능, 플러그인 구조 등에 활용 가능 |
4. Runtime Data Area: JVM 메모리 구조
JVM은 자바 애플리케이션 실행 시 다음과 같은 메모리 영역을 사용한다.
JVM 메모리 구조 흐름도
1
2
3
4
5
[Method Area] ← 클래스 구조 정보 (모든 스레드 공유)
[Heap] ← 객체 인스턴스 저장 (모든 스레드 공유)
[Stack (Thread별)] ← 메서드 호출 정보, 지역 변수 등 (스레드 개별)
[PC Register] ← 현재 실행 중인 명령어 주소 (스레드 개별)
[Native Stack] ← C/C++ 네이티브 메서드 실행용 공간 (스레드 개별)
영역 설명
- Method: Area 클래스의 구조 정보 저장 (메서드, 필드, 상수, static 변수 등)
- Heap: new 키워드로 생성된 객체 인스턴스가 저장됨
- Stack: 메서드 호출 시 생성되는 스택 프레임 저장, 지역 변수, 매개변수 등
- PC Register: 현재 실행 중인 명령어의 주소 저장 (스레드별로 존재)
- Native Method Stack: C/C++ 등 네이티브 메서드 실행을 위한 공간
5. Execution Engine: 실행 엔진
클래스를 JVM 메모리에 올리고 나면, 실제 실행은 Execution Engine에서 이루어진다.
1
2
3
4
5
[바이트코드]
↓
[Execution Engine]
↓
[네이티브 명령 실행]
Execution Engine 구성 요소
| 구성 요소 | 설명 |
|---|---|
| 인터프리터 | 바이트코드를 한 줄씩 해석하며 실행 (느림) |
| JIT | 반복되는 코드를 네이티브 코드로 컴파일하여 캐싱 (빠름) |
| GC | 가비지 컬렉션과 협력하여 메모리 관리 |
JIT(Just-In-Time) 컴파일러
- 바이트코드를 네이티브 코드로 변환해서 빠르게 실행
- 성능 향상을 위해 HotSpot JVM에서 자주 사용됨
GC: Garbage Collector
GC (Garbage Collector) 는 더 이상 사용하지 않는 객체를 자동으로 메모리에서 제거한다.
1
2
3
4
5
6
[Heap 영역]
↓ (사용 X)
[GC 감지]
↓
[객체 제거 → 메모리 회수]
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
