JVM (Java Virtual Machine)
JVM은 `.java` 소스파일(=원시코드)을 컴파일한 결과물인 `.class` 파일(=바이트코드)을 읽어서,
운영체제와 하드웨어에 맞게 실행할 수 있도록 해주는 가상 머신입니다.
Java는 운영체제(OS)에 종속적이지 않다는 특징이 JVM에 의해서 동작됩니다.
JVM 덕분에 자바는 한 번 작성한 코드를 윈도우, 리눅스, 맥 등 다양한 환경에서 같은 코드로 실행할 수 있습니다.
JVM의 주요 역할
역할 | 설명 |
바이트코드 실행 | 컴파일된 `.class` 파일을 읽고 실행 |
메모리 관리 | 객체 생성/삭제, 스택/힙 등 메모리 구조를 관리 |
GC (Garbage Collection) | 사용하지 않는 객체를 자동으로 정리해 메모리 누수를 방지 |
운영체제 독립성 보장 | 동일한 바이트 코드를 OS에 상관없이 실행할 수 있게 함 |
보안 및 예외 처리 | 클래스 로딩과 실행 시 보안 검사를 수행하고 예외 상황을 처리 |
Java 코드 실행 단계별 용어
용어 | 설명 |
원시 코드 (원시 프로그램) = 소스 코드 (source code) |
사람이 작성한 컴파일 전 코드 (`.java`) |
바이트코드 (bytecode) | 자바 컴파일러가 생성한 JVM용 중간 코드 (`.class`) |
기계어 (machine code) | CPU가 직접 이해하는 2진수 코드(바이너리 코드) (JVM은 이걸 대신 실행해줌) |
JVM의 구성 요소
- `Java Compiler(javac)`는 소스 코드를 `.class` 파일로 컴파일
- 이후 `Class Loader`가 클래스 파일을 JVM 메모리로 로딩
- `Execution Engine`은 인터프리터 또는 JIT 컴파일러를 통해 바이트코드를 기계어로 변환하여 실행
- `Garbage Collector`는 힙 메모리 영역에서 사용하지 않는 객체를 정리
1. Class Loader
- `.class` 파일을 메모리로 로딩하여 JVM 내부에서 사용할 수 있도록 함
- 로딩 → 검증 → 준비 → 분석 → 초기화 단계로 동작
- 자바 클래스 파일을 메모리에 로딩한 뒤,
- JVM이 실행할 수 있도록 연결(Linking)과 초기화(Initialization) 작업을 수행
2. 메모리 구조 (Runtime Data Area)
JVM은 실행 시 메모리를 여러 영역으로 나누어 관리합니다.
- `PC 레지스터`, `JVM Stack`, `Native Method Stack`은 스레드마다 별도로 생성
영역 | 설명 |
Program Counter (PC) Register | 현재 실행 중인 바이트코드 명령의 주소를 저장 |
JVM Stack | 메서드 호출 시 생성되는 스택 프레임 저장 지역 변수, 연산 중간 결과 등을 포함 |
Native Method Stack | 네이티브 코드를 실행할 때 사용하는 스택 |
❓ Native Code
운영체제에서 바로 실행할 수 있는 기계어 코드 (C/C++ 기반 코드)
- `Heap`, `Method Area`, `Runtime Constant Pool`은 모든 스레드가 공유하는 영역
영역 | 설명 |
Heap | 객체 인스턴스 저장 공간 GC의 주요 대상이며 모든 스레드가 접근 |
Method Area (= Class Area = Static Area) | 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간 클래스 정보, 메서드, static 변수 등 공통 데이터 저장 |
Runtime Constant Pool | 상수와 메서드/필드 참조 정보를 저장하는 공간 Method Area 내부에 포함됨 |
3. 실행 엔진 (Execution Engine)
바이트코드를 실제 기계어로 변환해 실행하는 역할:
- 인터프리터
- 자바 바이트 코드를 명령어 단위로 읽어서 실행
- 한 줄씩 해석 -> 느림
- JIT (Just-In-Time)
- 반복적으로 실행되는 메서드(핫스팟)를 감지해 바이트코드를 기계어로 변환하고,
- 이후에는 해당 부분을 인터프리팅 없이 직접 실행
- -> 성능 최적화
4. GC (Garbage Collector)
Heap에 존재하는 사용하지 않는 객체를 자동으로 수거
JVM과 JRE, JDK의 차이
구성 요소 | 설명 |
JVM (Java Virtual Machine) | 바이트코드를 해석하고 실행하는 가상 머신 |
JRE (Java Runtime Enviroment) | JVM + 실행에 필요한 라이브러리 패키지(`.jar`) |
JDK (Java Development Kit) | JRE + 개발 도구(`javac`, `javadoc`, `jarsigner` 등) |
JDK ⊃ JRE ⊃ JVM
'TIL (Today I Learned)' 카테고리의 다른 글
DB 개념 정리 🧠 | 정규화/반정규화, 인덱스, 트랜잭션, JOIN (1) | 2025.06.26 |
---|---|
Spring Boot 면접 대비 개념 정리❕ (1) | 2025.06.19 |
Synchronous 🆚 Asynchronous | RabbitMQ 기반 비동기 처리 구조 (2) | 2025.06.05 |
JWT 인증 기반 WebSocket 연결 실패, 원인과 해결법 (2) | 2025.06.05 |
Spring Boot 설정값 바인딩 정리: @Value vs @ConfigurationProperties (2) | 2025.05.24 |