JVM이란?
JVM(Java Virtual Machine)은 컴퓨터가 Java 프로그램을 실행할 수 있게 도와주는 소프트웨어입니다.
마치 통역사처럼, 사람이 이해할 수 있는 언어(Java 코드)를 컴퓨터가 실행할 수 있는 언어(기계어)로 바꿔주는 역할을 합니다.

Java 코드를 컴파일러를 통해 바이트코드(.class)로 변환하고, 이를 JVM이 실행 가능한 기계어로 변환합니다.
JVM 덕분에 Java는 "한 번 작성, 어디서나 실행"이 가능합니다.
JVM의 동작 원리

JVM은 크게 다음과 같이 이루어져있습니다.
- 클래스 로더(Class Loader)
- 실행 엔진(Execution Engine)
- 런타임 데이터 영역 (Runtime Data Area)
클래스 로더
Java ClassLoader는 JVM에서 클래스 파일을 로드하고 실행하기 위한 첫 번째 단계입니다.
.class 파일을 찾아 메모리에 로드하고 실행 가능한 상태로 만듭니다.
Method Area에 인스턴스 정보가 아닌 클래스 정보를 올리고, static 관련 변수는 이 단계에서 할당 및 초기화됩니다.
클래스 로드 작업은 한 번만 실행됩니다.
실행 엔진
실제 객체의 인스턴스를 생성하고 실행하는 것은 실행 엔진의 역할입니다.
바이트 코드를 실제로 실행하며, 그 과정에서 new로 생성하는 인스턴스를 생성하고 관리합니다.
new 객체를 생성하면, 다음과 같은 단계를 거칩니다.
- 클래스 정보 확인: Method Area에서 클래스 정의 확인.
- 메모리 할당: Heap에 객체를 위한 메모리를 할당.
- 필드 초기화: 기본값(int=0, boolean=false, null)으로 초기화.
- 생성자 호출: 초기화 로직 수행.
- 객체 참조 반환: Heap에 생성된 객체를 참조로 반환.
Interpreter와 Jit Compiler를 사용하여 실행합니다.
Interpreter: 바이트코드를 한 줄씩 읽고 실행
JIT Compiler: 자주 실행되는 코드를 네이티브 기계어로 변환하여 최적화 실행
또한 가비지 컬렉터를 사용하여 사용되지 않는 객체를 자동으로 메모리에서 제거합니다.
런타임 데이터 영역
VM이 프로그램 실행 중 사용하는 메모리 공간으로 위의 설명한 것 처럼 Method Area, Heap이 여기에 포함됩니다.
- Method Area: 클래스 정보, static 변수, 메서드 코드, 런타임 상수 풀 저장.
- Heap: new로 생성된 객체와 배열 저장.
- Stack: 각 스레드의 메서드 호출 정보와 지역 변수 저장.
정리
결과적으로 JVM이 어떻게 동작하는 지 정리하고자 한다면 이렇게 말할 수 있을 것 같습니다.
결국 JVM은 "바이트 코드를 기계어로 번역하고, 클래스 로딩하고, 객체 생성해서 스레드가 돌아갈 수 있게 만들어주는 도구"야!