- Java Virtual Machine, 자바 프로그램을 OS에 구애받지 않고 실행하게 해주는 소프트웨어
- JVM의 역할은 아래와 같다
- 바이트코드 실행 : 자바 컴파일러가 .java 파일을 .class 바이트코드로 변환하고, JVM이 해석해서 실행
- 운영체제 독립성 : 바이트코드를 운영체제에 맞게 변환하여 Java의 이식성을 보장
- 메모리 관리 수행 : 자동 메모리 할당, Garbage Collector를 통해 불필요 객체를 정리
- 보안 관리 : 샌드박스 환경을 제공해 외부 프로그램이 접근하지 못하게 보호
- Just-In-Time 컴파일러 : 바이트코드를 네이티브 코드로 변환해 실행 속도를 향상
구조
- JVM이 자바 프로그램을 실행하는 과정은 아래와 같다
- Java 코드 작성 (.java 파일)
- 컴파일 (javac 사용) → 바이트코드 (.class 파일) 생성
- Class Loader가 바이트코드를 JVM에 로드
- Execution이 바이트코드를 해석, 실행
- GC에서 사용되지 않는 객체를 정리하여 메모리 관리

구성 요소
- JVM은 크게 Class Loader, Runtime Data Area, Execution, Native Interface로 구성된다
Class Loader
- 바이트코드, .class 파일을 메모리에 적재하는 역할, 자바 프로그램이 실행될 때 필요한 클래스를 로드한다
- Loading : .class 파일을 찾아 메모리에 로드
- Linking : 바이트코드가 유효한지 검증하고 정적 변수, 기본값을 할당, 상수 참조를 실제 메모리 주소로 변환한다
- Initialization : 정적 변수에 값을 할당, 클래스의 static 블록 실행
Runtime Data Area
- JVM이 실행될 때 사용하는 메모리 영역
- Method Area : 클래스의 구조 (메소드, 변수 등) 저장
- Heap Area : 객체 및 인스턴스 저장
- Stack Area : 메소드 호출 스택
- PC Register : 현재 실행 중인 명령어의 위치 저장
- Native Method Stack : 네이티브 코드 (C, C++) 실행을 위한 스택
Execution