자바로 개발한 프로그램을 실행시킬때에 어떤 원리로 동작되는지를 알기위해서는 먼저 JVM 내부구조에 대해서 알아야할 필요가 있습니다.
Java Virtual Machine의 약자로 자바 가상 머신이라고 불리우며
자바와 운영체제 사이에서 중개자 역할을 수행합니다.
이밖에도 아래와 같은 특징을 가지고 있습니다.
1. 자바 컴파일러가 컴파일한 Java 바이트 코드(.class)를 해석합니다.
2. 가비지 컬렉터(GC)를 사용한 메모리 관리를 자동으로 수행합니다.

클래스 로더는 JVM 내로 .class 파일들을 로드하고 링크해서 런타임 데이터 영역(Runtime Data Area)에 배치하는 역할을 합니다. 쉽게 말해, JVM이 프로그램을 실행하기 위해 필요한 클래스들을 메모리에 불러들이는 과정이라고 생각하면 됩니다.
이 과정은 크게 세 단계로 나뉩니다.
Verify (검증): .class 파일 형식이 유효한지, 보안에 위협이 되는 코드는 없는지 등을 검사합니다.
Prepare (준비): 클래스 변수(static 변수)와 기본값에 해당하는 메모리를 할당합니다.
Resolve (해결): 심볼릭 레퍼런스(예: 다른 클래스의 메서드 참조)를 실제 메모리 주소(직접적인 레퍼런스)로 교체합니다.
런타임 데이터 영역은 JVM이 프로그램을 실행하면서 데이터를 저장하는 메모리 공간입니다. 이 영역은 여러 스레드가 공유하는 영역과 각 스레드별로 독립적인 영역으로 나뉩니다.
1. 스레드 공유 영역
2. 스레드 독립 영역**
실행 엔진은 런타임 데이터 영역에 로드된 바이트 코드를 실제로 실행하는 역할을 합니다. JVM의 두뇌라고 볼 수 있죠.
Interpreter : 바이트 코드를 한 줄씩 읽어서 실행합니다. 코드를 빠르게 시작할 수 있지만, 같은 코드를 여러 번 실행할 때 매번 해석해야 하므로 실행 속도가 느리다는 단점이 있습니다.
JIT Compiler (Just-In-Time Compiler) :인터프리터의 단점을 보완하기 위해 도입되었습니다. 자주 사용되는 바이트 코드를 미리 네이티브 코드로 컴파일하고 캐싱하여 재사용함으로써 실행 속도를 크게 향상시킵니다.
Compilation (컴파일): 바이트 코드를 네이티브 코드로 변환합니다.
Optimization (최적화): 컴파일된 코드를 더 효율적으로 실행할 수 있도록 최적화합니다.
Garbage Collector (가비지 컬렉터, GC) : 힙 영역에서 더 이상 어떤 변수도 참조하지 않는 객체들을 찾아 자동으로 메모리를 해제하여 관리합니다. 개발자가 직접 메모리를 할당하고 해제하는 번거로움을 줄여주어 메모리 누수와 같은 문제를 방지하는 데 도움을 줍니다.