자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 자바 프로그램이 운영체제(OS)나 하드웨어 아키텍처에 종속되지 않고 다양한 플랫폼에서 실행될 수 있도록 하는 중간 계층 역할을 한다.
주요 기능
- 바이트코드 실행: 자바 컴파일러(javac)가
.java소스 코드를 컴파일하여 생성한.class파일(바이트코드)을 해석하고 실행한다. - 메모리 관리: 런타임 데이터 영역(힙, 스택, 메서드 영역 등)을 관리하며, 가비지 컬렉션(Garbage Collection)을 통해 더 이상 사용되지 않는 객체 메모리를 자동으로 해제한다.
- 플랫폼 독립성 구현: "Write Once, Run Anywhere(WORA)" 원칙을 실현하기 위해, 각 운영체제(Windows, Linux, macOS 등)에 맞는 JVM 구현체를 제공한다.
- 보안: 클래스 로더(Class Loader)와 바이트코드 검증기(Bytecode Verifier)를 통해 검증되지 않은 코드의 실행을 방지하고 샌드박스(Sandbox) 환경을 제공한다.
구조 JVM은 크게 클래스 로더 서브시스템, 런타임 데이터 영역, 실행 엔진, 네이티브 인터페이스(JNI)로 구성된다.
- 클래스 로더: 클래스 파일을 로드, 링크, 초기화하여 런타임 데이터 영역에 배치한다.
- 실행 엔진: 바이트코드를 기계어로 변환하여 실행한다. 인터프리터 방식과 JIT(Just-In-Time) 컴파일러 방식을 혼용하여 성능을 최적화한다.
- 런타임 데이터 영역: 프로그램 실행 중 필요한 데이터(객체, 지역 변수, 스레드 정보 등)를 저장한다.
대표적인 구현체 가장 널리 쓰이는 구현체는 오라클(Oracle)에서 제공하는 '핫스팟(HotSpot) VM'이다. 이 외에도 오픈소스인 'OpenJDK', 이클립스 재단의 'Eclipse OpenJ9', 아줄 시스템즈의 'Zing', 그레일VM(GraalVM) 등이 있다.