1. JVM(Java Virtual Machine)이란?
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신이다. 자바 어플리케이션은 JVM 위에서 실행되며, JVM은 운영체제에 상관없이 동일하게 동작하는 환경을 제공한다. JVM은 자바 프로그램의 실행, 메모리 관리, 자동 가비지 수집 등을 담당한다. 자바 프로그램은 기계어가 아닌 바이트 코드로 컴파일되며, JVM은 이 바이트 코드를 기계어로 변환하여 실행한다. JVM은 플랫폼 독립성을 제공하고, 자바의 특징인 이식성과 보안성을 강화한다. 따라서, 한 번 작성한 자바 프로그램은 JVM이 설치된 어떤 환경에서도 실행할 수 있다. JVM은 내부적으로 다양한 컴포넌트로 구성되어 있으며, 이들은 상호작용하면서 자바 프로그램을 실행하는 데 필요한 기능을 제공한다.
2. JVM의 내부 구조
JVM은 크게 세 개의 주요 구성요소로 나뉜다. 이는 클래스 로더, 실행 엔진, 런타임 데이터 영역이다.
2.1 클래스 로더(Class Loader)
클래스 로더는 JVM이 필요로 하는 클래스 파일을 로드하는 역할을 한다. 자바 어플리케이션이 실행될 때, JVM은 해당 어플리케이션에서 사용하는 클래스들을 찾고 로드한다. 클래스 로더는 클래스 파일을 메모리에 로드하고, 링크 작업을 통해 실행 준비를 마친다.
2.2 실행 엔진(Execution Engine)
실행 엔진은 로드된 클래스의 바이트 코드를 실행하는 역할을 한다. 실행 엔진은 바이트 코드를 기계어로 변환하고, 메모리 상의 런타임 데이터 영역에 배치시켜 실행한다. 주요한 실행 엔진으로는 인터프리터와 JIT 컴파일러가 있다. 인터프리터는 바이트 코드를 한 줄씩 읽어 기계어로 변환하고 실행한다. JIT 컴파일러는 바이트 코드 전체를 기계어로 변환하고 캐시에 저장하여 반복 실행 시에 빠른 속도를 보장한다.
2.3 런타임 데이터 영역(Runtime Data Area)
런타임 데이터 영역은 JVM이 프로그램을 실행하는 데 필요한 데이터를 저장하는 공간이다. 이 영역에는 프로그램의 클래스, 객체, 메소드, 스레드 등이 저장된다. 런타임 데이터 영역은 세 가지 영역으로 분할되며, 메소드 영역, 힙 영역, 스택 영역으로 구성된다.
- 메소드 영역: 클래스 멤버 변수, 정적 메소드, 상수 등 클래스에 대한 정보가 저장된다.
- 힙 영역: 동적으로 생성된 객체와 배열이 저장된다.
- 스택 영역: 메소드 호출 시에 사용되는 파라미터, 지역 변수, 임시 데이터 등이 저장된다.
이러한 런타임 데이터 영역은 JVM이 프로그램을 실행하는 동안 데이터를 동적으로 할당, 관리하며, 가비지 컬렉션을 수행하여 불필요한 객체를 제거한다.
3. JVM의 메모리 구조
JVM은 자바 프로그램을 실행하기 위해 운영체제로부터 할당받은 메모리를 관리한다. JVM의 메모리 구조는 크게 네 가지로 나눌 수 있다. 이는 메소드 영역, 힙 영역, 스택 영역, PC 레지스터이다.
3.1 메소드 영역(Method Area)
메소드 영역은 클래스에 대한 메타데이터를 저장하는 공간이다. 이 영역에는 클래스의 구조, 필드, 메소드, 정적 변수 등 클래스와 관련된 정보가 저장된다. 또한 상수 풀(Constant Pool)도 메소드 영역에 저장되어 있다. 상수 풀은 클래스에서 사용하는 상수 값들을 저장하고, 런타임 상수 풀(Runtime Constant Pool)은 런타임에 동적으로 추가되는 상수 값을 관리한다.
3.2 힙 영역(Heap Area)
힙 영역은 객체와 배열이 생성되는 공간이다. 자바에서는 모든 객체와 배열이 동적으로 메모리를 할당받아 힙 영역에 생성된다. 힙 영역은 JVM이 시작될 때 미리 설정한 초기 크기로부터 동적으로 증가하거나 감소할 수 있다.
3.3 스택 영역(Stack Area)
스택 영역은 스레드마다 별도로 생성되며, 메소드의 호출과 관계된 로컬 변수, 매개변수, 임시 데이터 등의 정보를 저장한다. 메소드가 호출될 때마다 스택 프레임(Stack Frame)이 생성되고, 메소드가 종료되면 스택 프레임이 스택 영역에서 제거된다. 스택 영역은 후입선출(LIFO, Last-In-First-Out) 구조로 동작하여, 메소드가 중첩되면 스택 프레임이 계속해서 쌓이게 된다.
3.4 PC 레지스터(Program Counter Register)
PC 레지스터는 현재 실행 중인 명령어의 주소를 저장하는 공간이다. JVM은 스레드마다 별도의 PC 레지스터를 유지하며, 각 스레드는 독립적으로 명령어를 실행한다. PC 레지스터는 명령어의 실행 위치를 추적하고, 다음에 수행할 명령어의 위치를 가리킨다.