자바 가상 머신(Java Virtual Machine)
기술노트
☕ 자바 가상 머신(Java Virtual Machine)
시스템 메모리를 관리하면서, 자바 기반 애플리케이션을 위해 **이식 가능한 실행 환경**을 제공함.
JVM은 다른 프로그램을 실행시키는 것이 목적이며, 아래와 같은 기능을 갖추고 있음:
- 자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 함
- 프로그램 메모리를 관리하고 최적화함
JVM은 코드를 실행하고, 해당 코드에 대해 런타임 환경을 제공하는 프로그램에 대한 사양임
개발자들이 말하는 JVM은 일반적으로 *자바 애플리케이션을 실행하고 관리하는 프로세스*를 의미함. 클래스 로더를 통해 자바 애플리케이션을 읽고, 자바 API와 함께 실행하며, 운영체제와 자바 애플리케이션 사이의 **중개자 역할**을 수행함.
🧠 JVM에서의 메모리 관리
JVM 실행에 있어서 가장 일반적인 상호작용은 힙과 스택의 메모리 사용을 확인하는 것임.
🔁 실행 과정
🔁 JVM 실행 과정 요약
- JVM이 실행되면, 운영체제에서 필요한 메모리를 받습니다.
- `javac`가 `.java` 파일을 `.class` 바이트코드로 변환합니다.
- 클래스 로더가 `.class` 파일을 메모리로 불러옵니다.
- 실행 엔진이 바이트코드를 해석하여 실행합니다.
- 실행 중에 스레드 동기화와 가비지 컬렉션이 자동으로 처리됩니다.
🛠 주요 구성 요소
📘 자바 컴파일러
- 자바 소스코드(`.java`)를 바이트코드(`.class`)로 변환함
📦 클래스 로더
- JVM은 런타임에 클래스를 처음 참조할 때 동적으로 로드함
- 이 작업을 담당하는 것이 클래스 로더
🧱 JVM 메모리 영역 구조 (Runtime Data Areas)
JVM이 운영체제에서 실행되면서 할당받는 메모리 영역
영역 | 설명 |
---|---|
PC 레지스터 | 각 스레드가 현재 실행 중인 명령어의 주소를 저장 |
JVM 스택 | 지역 변수, 매개변수, 메서드 호출 정보를 저장 |
네이티브 메서드 스택 | 네이티브(기계어) 메서드를 위한 공간 |
힙(Heap) | 객체, 배열 등 런타임에 생성된 데이터 저장. 가비지 컬렉션 대상 |
메서드 영역 | 클래스 정보, 상수, 정적 변수, 메서드 바이트코드 저장 |
- 힙과 메서드 영역은 모든 스레드가 **공유**
- PC 레지스터, JVM 스택 등은 **스레드마다 개별**
🧹 가비지 컬렉션(Garbage Collection)
자바는 JVM이 메모리를 자동으로 관리함
- 불필요해진 객체를 탐색해 제거하고, 그 메모리를 재사용
- 힙 영역에서 동작하며, 주기적으로 작동
가비지 컬렉션 절차:
- 참조되지 않은 객체 탐색
- 해당 객체 메모리 회수
- 힙 공간 정리 및 재사용