자바

[ Java ] JVM의 구성요소와 각 구성요소의 역할

hola. 2026. 8. 28. 11:02

JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 기계로, 크게 Class Loader, Execution Engine, Garbage Collector, 그리고 Runtime Data Area의 4가지 핵심 구성 요소로 이루어져 있습니다.

1. 클래스 로더 (Class Loader)
자바 컴파일러가 .java 파일을 컴파일해서 만든 .class(바이트코드) 파일을 읽어 들여, Runtime Data Area(메모리)에 동적으로 로드하고 링크하는 역할을 합니다.

Loading: 바이트코드를 읽고 메모리에 binary 형태로 저장합니다.

Linking: 검증(Verify - 올바른 바이트코드인지), 준비(Prepare - 메모리 할당), 해결(Resolve - 심볼릭 레퍼런스를 다이렉트 레퍼런스로 교체) 단계를 거칩니다.

Initialization: 클래스 변수들을 적절한 값으로 초기화합니다.

2. 실행 엔진 (Execution Engine)
클래스 로더를 통해 메모리에 적재된 바이트코드를 실제로 실행합니다. 바이트코드를 명령어 단위로 읽어서 실행하며, 다음의 두 가지 방식을 혼용합니다.

Interpreter: 바이트코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 속도가 느리다는 단점이 있습니다.

JIT Compiler (Just-In-Time): 인터프리터의 단점을 보완하기 위해 도입되었습니다. 반복되는 코드가 발견되면 바이트코드 전체를 컴파일하여 네이티브 코드(기계어)로 변환해 두고, 다음부터는 인터프리팅 없이 직접 실행하여 성능을 높입니다.

3. 가비지 컬렉터 (Garbage Collector, GC)
더 이상 참조되지 않는 객체(힙 메모리에 생성된 불필요한 데이터)를 자동으로 탐지하여 제거함으로써 메모리 공간을 관리해 주는 장치입니다. 개발자가 수동으로 메모리를 해제하지 않아도 되도록 돕습니다.

4. 런타임 데이터 영역 (Runtime Data Area)
자바 프로그램을 실행하기 위해 OS로부터 할당받는 JVM의 메모리 공간입니다. 크게 5가지 영역으로 나뉩니다.

Heap Area: new 연산자로 생성된 모든 객체와 인스턴스 변수가 저장되는 공간입니다. GC의 주 대상이 됩니다.

Stack Area (JVM Stack): 스레드마다 하나씩 존재하며, 지역 변수, 매개변수, 메서드 호출 정보(Frame) 등이 저장되는 공간입니다. 메서드가 호출될 때 마다 프레임이 쌓이고 종료되면 pop 됩니다.

Method Area (Class Area / Metaspace): 클래스 정보(클래스명, 부모 클래스명, 메서드, 필드 등), 상수(Constant Pool), static 변수 등이 저장되는 공용 공간입니다.

PC Register: 현재 실행 중인 스레드의 주소(명령어 위치)를 기록하는 작은 공간입니다. 스레드마다 하나씩 존재합니다.

Native Method Stack: 자바 외의 언어(C/C++)로 작성된 네이티브 코드를 실행하기 위한 스택입니다. (JNI 호출 시 사용)