JVM(Java Virtual Machine)은 자바 바이트코드(.class 파일)를 입력받아 이를 한 줄씩 해석하고, 운영체제와 하드웨어가 이해할 수 있는 기계어로 변환해주는 프로그램입니다. 개발자가 작성한 자바 코드가 실제로 실행되기 위해서는 반드시 JVM을 거쳐야 하며, 이 과정에서 메모리 관리 역시 JVM이 담당합니다.
클래스 로더(Class Loader)의 역할
JVM 내부에는 클래스 로더(Class Loader)라는 모듈이 포함되어 있습니다. 클래스 로더는 프로그램 실행에 필요한 클래스를 불러오고, 연결하고, 초기화하는 역할을 수행하며, 구체적으로 다음과 같은 작업을 처리합니다.
- 컴파일된 클래스를 메모리에 로드합니다.
- 로드된 바이트코드 명령어를 검증하여 보안과 무결성을 확인합니다.
- 프로그램 실행에 필요한 메모리를 할당합니다.
JVM의 5가지 메모리 영역
JVM은 크게 다음 5가지 메모리 영역으로 구분할 수 있습니다.
1. 힙(Heap)
new 키워드로 생성된 객체 등 참조 타입 인스턴스가 저장되는 런타임 데이터 영역입니다. 모든 스레드가 공유하며, 가비지 컬렉션(GC)이 동작하는 핵심 대상 영역이기도 합니다.
2. 스택(Stack)
지역 변수와 메서드 호출 시 발생하는 중간 계산 결과를 저장하는 영역입니다. 스택은 프레임(Frame) 단위로 구성되며, 각 스레드마다 하나의 스택이 독립적으로 생성됩니다. 스레드의 실행이 종료되면 해당 프레임도 함께 소멸하며, 메서드 호출과 반환 과정에도 깊이 관여합니다.
3. PC 레지스터(Program Counter Register)
현재 JVM이 실행하고 있는 명령어의 주소 값을 저장하는 레지스터입니다. 스레드마다 하나씩 존재하여, 멀티스레드 환경에서도 각 스레드가 어떤 명령을 수행 중인지 추적할 수 있게 해줍니다.
4. 실행 엔진(Execution Engine)
클래스 로더가 메모리에 적재한 바이트코드를 실제로 실행하는 부분입니다. 가상 프로세서, 바이트코드를 한 줄씩 해석하는 인터프리터(Interpreter), 그리고 반복 실행되는 코드를 네이티브 코드로 변환해 성능을 높이는 JIT(Just-In-Time) 컴파일러로 구성됩니다.
5. 네이티브 메서드 스택(Native Method Stack)
애플리케이션이 사용하는 모든 네이티브 메서드(C, C++ 등 자바 외 언어로 작성된 코드)의 실행 정보를 담고 있는 영역입니다.
마무리 정리
정리하면, JVM은 힙, 스택, PC 레지스터, 실행 엔진, 네이티브 메서드 스택이라는 다섯 가지 주요 영역을 통해 자바 프로그램의 실행과 메모리를 관리합니다. 참고로 JVM 표준 사양(Runtime Data Areas) 기준으로는 이 목록에 메서드 영역(Method Area), 즉 최신 JVM에서는 메타스페이스(Metaspace)라고 불리는 클래스·메서드 메타데이터 저장 영역도 별도로 존재한다는 점을 함께 알아두면 좋습니다.