자바 가상 머신(Java Virtual Machine) 은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다.
JVM은 쉽게 말하면 자바 프로그램을 실행하기 위한 가상 컴퓨터(실행 환경)이다.
자바의 핵심 목표는 "Write Once, Run Anywhere"이다. Windows, macOS, Linux는 서로 다른 기계어를 사용하고 자바는 OS마다 코드를 다시 만들지 않도록 설계되어 이를 가능하게 해주는것이 JVM이다.

자바 가상 머신(Java Virtual Machine)인 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것이다.
1. 자바 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당받는다.
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트 코드(.class)로 컴파일 한다.
3. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크 하여 Runtime Data Area(실질적인 메모리를 할당 받아 관리하는 영역)에 올린다.
4. Runtime Data Area에 로딩 된 바이트 코드는 Execution Engine을 통해 해석된다.
5. 이 과정에서 Execution Engine에 의해 Garbage Collector의 작동과 Thread 동기화가 이루어진다.

1. ClassLoader
ClassLoader는 Java 컴파일러로 컴파일한 후 생성된 바이트 코드 파일(.class)들을 JVM 메모리(또는 Runtime Data Area)에 적재하는 JVM의 하위 시스템이다. 세가지 주요 기능을 수행한다.
2. Class Method Area
Class 데이터가 저장되는 JVM의 데이터 영역 중 하나이다. satic variavles, static blocks, static method, instance method가 이곳에 저장된다.
3. Heap
모든 new 예약어로 생성된 Object와 그것과 관련된 instance variable과 array는 Heap에 저장된다. Class Method Area에 적재된 Class만 생성가능하다. 이 메모리영역은 여러 thread에서 공유된다.
4. JVM Language Stacks
Language Stacks는 local variable을 저장한다. Heap영역에 생성된 Object의 메모리 주소값을 저장하고 있고 각 thread는 그에 맞는 JVM stack이 있다. 코드블럭을 만나면 스택프레임을 생성하고 블럭이 끝나면 스택프레임이 사라진다.
5. PC Registers(Program Counter Registers)
일반적인 컴퓨터 구조 용어로써 다음에 실행할 명령어의 주소를 가지고 있다. thread가 생성될 때 함께 생성된다.
6. Native Method Stacks
JVM에서 작동하는 언어 외에 다른 언어로 작성한 Method를 저장하는 공간이다.
7. Execution Engine
Execution Engine은 ClassLoader를 통해 JVM Memory영역에 할당 된 바이트 코드를 실행한다. 엔진은 인터프리터, JIT compiler로 이루어져있다.
8. Native Method Interface
JNI는 JVM에서 실행되는 자바 코드가 네이티브 언어(C/C++)로 작성된 코드를 호출하거나, 그 반대로 호출할 수 있도록 하는 인터페이스이다.
9. Native Method Libraries
Native Method Libraries는 JNI를 통해 JVM에서 호출되는 플랫폼 의존적인 네이티브 코드 라이브러리이다.
오오오오오올