JVM에 대해 알아보자.
jvm 이란??
Java Virtural Machine의 약자이며, 이 jvm을 통해서 Java가 OS에 독립적으로 작동할 수 있다.
.java파일(자바 소스 코드)을 javac(자바컴파일러)가 .class파일(자바바이트코드)로 변경해 주고,
jvm은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행한다.
동작과정
1. 소스 코드 작성 및 컴파일 (Compilation)
- 개발자는 Java 소스 코드(.java 파일)를 작성한 후, 이를 javac(Java Compiler)를 이용해 컴파일한다.
- 컴파일이 완료되면 바이트 코드(.class 파일)가 생성된다.
- 바이트 코드는 JVM에서 실행될 준비가 된 중간 코드(중간 언어)이다.
2. 클래스 로딩 (Class Loading)
- JVM이 실행되면, 클래스 로더(Class Loader)가 필요한 .class 파일을 메모리에 로드한다.
- 클래스 로딩 과정은 세 단계로 이루어진다:
- 로딩 (Loading)
- 바이트 코드를 JVM의 메모리에 적재한다.
- 링크 (Linking)
- 검증 (Verification): 바이트 코드가 유효한지 검증한다.
- 준비 (Preparation): 클래스 변수(static 변수)들을 메모리에 할당하고 기본값으로 초기화한다.
- 해결 (Resolution): 모든 심볼릭 참조를 실제 메모리 주소로 변환한다.
- 초기화 (Initialization)
- static 변수의 초기화 및 static 블록을 실행한다.
- 로딩 (Loading)
3. 런타임 데이터 영역 할당 (Runtime Data Area)
JVM은 실행을 위해 메모리를 여러 영역으로 나누어 관리한다.
- 메서드 영역(Method Area)
- 클래스의 구조(메서드, 필드 정보 등)를 저장하는 공간
- static 변수도 저장됨
- 힙(Heap)
- new 키워드로 생성한 객체가 저장되는 공간
- GC(Garbage Collector)가 관리하는 영역
- 스택(Stack)
- 메서드 호출 시 생성되는 스택 프레임(지역 변수, 매개변수, 연산 중간 값 등)이 저장됨
- PC 레지스터(PC Register)
- 현재 실행 중인 JVM 명령어 주소를 저장
- 네이티브 메서드 스택(Native Method Stack)
- 자바가 아닌 네이티브 코드(C, C++ 등) 실행을 위한 스택
4. 바이트 코드 실행 (Execution)
- JVM의 실행 엔진(Execution Engine) 이 바이트 코드를 읽고 실행한다.
- 실행 방식은 다음과 같다.
- 인터프리터 (Interpreter)
- 한 줄씩 바이트 코드를 읽고 해석 후 실행 (빠른 시작, 느린 실행)
- JIT (Just-In-Time) 컴파일러
- 실행 중에 바이트 코드를 기계어로 변환하여 성능을 최적화 (느린 시작, 빠른 실행)
- HotSpot JVM에서는 자주 실행되는 코드를 기계어로 변환하여 실행 속도를 높인다.
- 인터프리터 (Interpreter)
5. 가비지 컬렉션 및 종료 (Garbage Collection & Termination)
- JVM은 사용되지 않는 객체를 GC(Garbage Collector)를 통해 자동으로 정리한다.
- 프로그램이 종료되면 JVM도 함께 종료된다.
JVM 구조
┌──────────────────────────────────────┐
│ JVM │
├───────────────┬──────────────────────┤
│ **클래스 로더 (Class Loader)** ㅣ ← .class 파일 로드 및 링크
├───────────────┼──────────────────────┤
│ **메모리 영역 (Runtime Data Area)** ㅣ
│ ├── 메서드 영역 (Method Area) ㅣ ← 클래스 정보, static 변수 저장
│ ├── 힙 (Heap) │ ← 객체 저장 (new 키워드)
│ ├── 스택 (Stack) │ ← 메서드 호출 정보 저장
│ ├── PC 레지스터 (PC Register) ㅣ ← 현재 실행 명령어 위치
│ ├── 네이티브 메서드 스택 (Native) │ ← 네이티브 코드 실행
├───────────────┼──────────────────────┤
│ **실행 엔진 (Execution Engine)** ㅣ
│ ├── 인터프리터 (Interpreter) ㅣ ← 바이트 코드 한 줄씩 해석 실행
│ ├── JIT 컴파일러 (JIT Compiler) ㅣ ← 자주 실행되는 코드 최적화
│ ├── 가비지 컬렉터 (GC) ㅣ ← 사용하지 않는 객체 정리
├───────────────┼──────────────────────┤
│ **네이티브 인터페이스 (JNI)** │ ← C, C++ 등 네이티브 코드 호출
└──────────────────────────────────────┘
이상 JDK의 Java Runtime Environment 내부의 jvm에 대해 알아보았다.

반응형
'정리' 카테고리의 다른 글
| URL 입력부터 페이지 렌더링까지 (1) | 2025.04.07 |
|---|---|
| 포트포워딩, TCP/IP (0) | 2025.03.19 |
| Thread (0) | 2025.03.05 |
| Java Garbage Collector (0) | 2025.02.27 |
| REST API (0) | 2025.02.25 |