JVM(Java Virtual Machine)은 자바 가상 머신의 약자로 바이트 코드(.class 파일)을 실행하는 가상 기계다.
JVM이 존재하기에 운영체제나 하드웨어에 종속되지 않고, 어떤 환경에서든 자바 프로그램을 실행할 수 있다.

JVM의 구조를 자세히 알아보기 이전에, 먼저 Java 코드를 실행하는 큰 틀을 설명하면 다음과 같다.
- 소스 코드를 자바 컴파일러(javac)가 컴파일하여 바이트 코드를 만든다.
- 바이트 코드를 JVM이 읽어들여서 실행하고 관리한다.
참고로, 아래는 Java에서 언급되는 코드관련 용어를 정리해보았다.
소스 코드: .java 확장자로 이루어진 파일이다. 자바 언어로 쓰여있다.
바이트 코드: .class 파일을 의미한다. 기계어는 아니고, 컴파일 후 생성되는 중간코드다. JVM이 읽어들일 수 있는 형식의 코드이다.
네이티브 코드: C, C++, 어셈블리어로 구성된 코드. JAVA에서 부모가 되는 언어를 의미한다.
기계어: 0,1의 이진 코드로 되어 있어서, CPU가 직접 해석하고 실행할 수 있는 언어를 의미한다.

JVM의 구조는 Class Loader, Execution engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있다.
JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
어플리케이션에서 필요한 경우에, 바이트 코드(.class)들을 JVM의 Runtime Data Area에 적재한다.
Runtime Data Area에 있는 바이트 코드를 해석하고 실행한다.
실행 엔진의 구성 요소는 다음과 같다.
- 인터프리터
- JIT 컴파일러
- GC(Garbage Collector)
바이트 코드를 JVM 내부의 기계가 실행할 수 있는 기계어로 바꾸어 실행하는데, 인터프리터와 JIT 컴파일러를 혼합해 사용한다.

메모리 관리를 위해 GC가 사용된다.
프로그램 실행 중에 사용되는 다양한 영역이다.
런타임 데이터 영역은 다음과 같다.
- 메서드 영역
- 힙 영역
- 스택 영역
- PC Register
- 네이티브 메서드 스택(Native Method Stack)

여기서 메서드 영역, 힙 영역은 모든 쓰레드가 공유한다.
스택 영역, PC Register, Native Method Stack 영역은 각 쓰레드마다 생성되고, 공유되지 않는다.
자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공한다.
C, C++로 작성된 라이브러리다.

