JVM(Java Virtual Machine)
운영체제에 종속받지 않고 CPU가 Java 인식하고 실행할 수 있도록 해주는 가상 컴퓨터이다.
→ 이 덕분에 자바는 운영체제에 독립적이라는 장점을 가지게 된다.

자바 언어 자체는 CPU가 인식하지 못하기에 기계어로 컴파일을 해줘야 하는데 이때 Java는 byte코드로 변환된 후 JVM이 binary code로 변환된다.
- Java 작성한 소스파일은 JVM을 거쳐 운영체제와 상호작용 함
- JVM 덕분에 Java는 “운영체제로부터 독립적”라는 특징을 가짐 (Write Once, Run Anywhere)
구조

Class Loader
클래스 파일(.class)을 로드하고 링크를 통해 배치하는 작업 수행한다. 런타임 시, 동적으로 클래스 로드하고 jar 파일 내 저장된 클래스들을 JVM 런타임 데이터 영역에 로드한다.
- Loading
- 자바 컴파일러가 생성한 바이트 코드를 읽어와 JVM 메모리에 저장
- 읽어온 바이트코드 내용을 분석해 클래스에 대한 정보를 Method Area에 저장
- Linking
- 로드된 클래스 파일의 내용을 검증하고 필요한 메모리를 할당하며 실제 메모리 주소로 교체
- 메모리를 할당할 때 우리가 아는 기본값으로 초기화(int=0, boolean=false …)
- Initialization
- 클래스 변수(static 변수)들을 개발자가 코드에 명시한 값으로 최종 초기화함
- 클래스에 정의된 static 블록들을 이 단계에서 실행
Execution Engine
Class Loader가 가져온 바이트 코드를 해석하고 실행한다.
- Interpreter
- 자바 바이트 코드를 명령어 단위로 읽어서 수행
- 속도는 느리지만 수정 시 즉각적인 반응 확인 가능
(매번 한 줄씩 해석)
- Just-in-Time
- 인터프리터가 코드를 실행하다가 자주 반복되는 부분(HotSpot)을 발견하면 그 부분 전체를 런타임에 해당 시스템에 최적화된 기계어(네이티브 코드)로 컴파일함
→ 컴파일된 네이티브 코드는 캐시에 저장해두고 다음부터는 인터프리터를 거치지 않고 바로 사용
- 인터프리터가 코드를 실행하다가 자주 반복되는 부분(HotSpot)을 발견하면 그 부분 전체를 런타임에 해당 시스템에 최적화된 기계어(네이티브 코드)로 컴파일함
- Garbage collector
- 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
(Heap 영역에서)
- 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
Runtime Data Area
JVM이 프로그램을 실행하며 사용하는 메모리 공간이다. 즉, 운영체제로부터 할당받은 메모리 영역 의미한다.
- Method Area
- 클래스 수준의 정보와 static 변수, 상수등이 저장
- 모든 스레드가 공유
- Heap Area
- new 키워드로 생성된 인스턴스와 배열이 저장되는 공간
- 가비지 컬렉션의 주된 대상
- 모든 스레드가 공유
- Stack Area
- 메서드 호출 시마다 메서드의 정보를 담는 스택 프레임이 생성되어 저장됨
- 스레드마다 별도의 스택 할당 → 메서드 호출 끝나면 자동 제거
- PC Registers
- 각 스레드는 현재 실행중인 JVM 명령어의 주소를 저장하는 PC 레지스터를 가짐
- Native Method Stack
- 자바 외의 언어로 작성된 코드 실행 시 사용되는 메모리 영역
'Development & Projects > Java' 카테고리의 다른 글
| [Spring] 스프링 빈이란? / Spring Bean / 등록 방법 / 빈 스코프 / LifeCycle (0) | 2025.09.30 |
|---|---|
| [Java] 비동기 처리와 스레드 관리 (0) | 2025.09.27 |
| [Java] 상속 정리 / 다중 상속 / 다이아몬드 문제 (0) | 2025.09.21 |
| [Java] 추상 클래스와 인터페이스 정리 (0) | 2025.09.20 |
| [Java] 자바 컴파일 과정 (0) | 2025.06.28 |