💡 JVM은 자바 프로그램을 효율적으로 실행하기 위해
컴파일(바이트코드 변환) → 클래스 로딩 → 메모리 할당(Runtime Data Area) →
실행(인터프리터+JIT) → 가비지 컬렉션 → 예외 처리 → 종료 단계를 수행

자바 소스 파일(.java)을 JVM이 이해할 수 있는 바이트코드(.class)로 변환.
구문 오류·타입 오류 확인
변환 과정에서 발생하는 오류 = 컴파일 타임 에러
바이트코드는 OS 독립적이며 JVM이 설치된 환경이라면 동일하게 실행 가능
WORA (Write Once, Run Anywhere): 한 번만 컴파일하면 중간코드인 바이트코드 생성, HW/OS 무관 실행(jvm 내에서)
자바는 컴파일(바이트코드 변환) + 인터프리터(바이트코드 런타임 실행) 혼합 방식을 사용
과정: Java Source File(.java) → (Java Compiler) → Byte Code(.class)
바이트코드를 JVM 메모리(Runtime Data Area)에 적재. (Runtime 시점에 로드)
세부과정: Loading → Linking → Initialization
*.class 읽어 적절한 binary data를 만들고 runtime data area의 method area에 저장. (static main() 먼저) // InitDemo.java
public class InitDemo {
static int count = 10; // Prepare: 기본값 0 → Initialization: 10
static {
System.out.println("static block executed");
count += 5;
}
public static void main(String[] args) {
System.out.println(count); // 15
}
}JVM이 프로세스로써 수행되기 위해 OS로부터 할당받은 메모리 공간.

로드된 바이트코드를 실제 해석, 실행하는 엔진. 이 과정에서 ByteCode가 BinaryCode로 변경.
Interpreter: 한 줄씩 실행(기본)
JIT Compiler: 반복 코드 기계어 변환 후 캐시 실행(자주 실행_HotSpot 모니터)
Garbage Collection: 불필요 객체 정리
JNI(Java Native Interface): 자바 코드와 네이티브 코드(C, C++ 등) 간의 상호작용을 가능하게 하는 표준 인터페이스. 네이티브 코드와 연동
네이티브 코드에 대한 해석은 Native Method Interface, Native Method Libaray에서 수행
바이트코드를 한 줄씩 해석하고 실행
장점: 즉시 실행 가능
단점: 전체 실행 속도는 느림
과정
이전에 할당된 메모리에서 바이트코드 읽어옴
-> 인터프리터를 통해 한줄 씩 읽고 해석
-> 바이트 코드를 해석하는 동안 인터프리터는 필요한 메모리 및 리소스를 할당하고 해당 바이트 코드에 따라 실행
-> 바이트 코드가 실행되는 동안 인터프리터는 필요한 경우에 따라 라이브러리 및 다른 클래스를 로드하고 사용
-> 인터프리터는 바이트 코드를 순차적으로 해석하면서 프로그램을 실행
전체를 컴파일 하지 않고, 인터프리터가 자주 사용하는메소스의 byte 코드를 컴파일하여 binary 코드로 변환 후 코드 캐시에 저장
이후 동일 코드 실행 시 인터프리터로 해석하지 않고 캐시된 binary 코드(기계어) 사용 → 속도 향상
해당 기술은 프로그램을 실행하는 동안 실시간으로 바이트 코드를 기계어로 변환하여 성능을 향상.
과정
이전에 생성하고 할당된 메모리를 기반으로 바이트 코드를 읽어옴
-> JIT 컴파일러는 실행 중인 프로그램을 모니터링하면서 빈번하게 실행되는 코드 블록을 식별.
-> 해당 코드 블록은 인터프리터에 의해 실행될 때마다 JIT 컴파일러에 의해 기계어로 변환
-> JIT 컴파일러는 변환된 기계어 코드를 캐시에 저장.
-> 이후 동일한 코드 블록이 다시 호출되면, 캐시에 저장된 기계어 코드를 실행하여 인터프리터에 비해 훨씬 빠른 실행 속도를 제공.
실행 중 예외 발생 시 JVM은 예외 객체를 생성하고 적절한 핸들러를 찾아 처리.
프로그램 실행이 완료되거나 명시적으로 종료되면 JVM은 자원을 해제하고 종료 코드를 반환.
🔎 더 알아보기
🔗 참고