JVM은 자바 애플리케이션을 실행하기 위한 가상 머신이다.
자바는 운영체제(OS)에 직접 종속되지 않고, 한 번 작성된 코드가 다양한 환경에서 실행될 수 있도록 설계되었다.
이것이 바로 "Write Once, Run Anywhere" 개념이며, 이를 가능하게 하는 것이 바로 JVM이다.
자바 프로그램은 일반적인 프로그램과 실행 방식이 다르다.
일반적인 프로그램은 운영체제에서 직접 실행되는 기계어로 변환되지만,
자바 프로그램은 JVM 위에서 동작하는 바이트코드(.class 파일) 형태로 실행된다.
JVM이 이 바이트코드를 해석(interpret)하거나 컴파일(compile)하여 실행하는 방식이다.
JVM을 사용하는 가장 큰 이유는 플랫폼 독립성 때문이다.
자바로 작성된 프로그램은 Windows, macOS, Linux 등 어떤 운영체제에서도 실행될 수 있다.
이는 JVM이 각 운영체제에 맞는 인터프리터 역할을 수행하기 때문이다.
또한 JVM은 단순한 실행 환경이 아니라 메모리 관리, GC(Garbage Collection), 실행 최적화(JIT Compilation) 등 다양한 기능을 제공한다.
이 덕분에 자바는 성능과 안정성이 뛰어난 프로그램을 개발할 수 있도록 지원한다.
JVM은 크게 클래스 로더(Class Loader), 메모리 영역(Memory Area), 실행 엔진(Execution Engine)으로 나뉜다.
클래스 로더는 자바 클래스 파일(.class)을 로드하여 JVM 메모리에 적재하는 역할을 한다.
클래스 로더는 필요한 클래스를 처음 사용할 때 로드하며, 이를 동적 로딩(Dynamic Loading)이라고 한다.
클래스 로더는 크게 세 가지 단계로 동작한다.
.class
파일을 읽고 JVM 메모리에 적재한다. JVM은 프로그램을 실행하기 위해 여러 메모리 영역을 활용한다.
각각의 메모리 영역은 프로그램 실행에 필요한 데이터를 저장하거나 관리하는 역할을 한다.
new
키워드를 사용하면 힙 영역에 객체가 생성되며, 가비지 컬렉터(GC)가 필요 없는 객체를 제거한다. 실행 엔진은 바이트코드를 실제로 실행하는 역할을 한다.
바이트코드는 기계어가 아니기 때문에, 실행 엔진이 이를 해석하고 변환하는 과정이 필요하다.
실행 엔진에는 인터프리터(Interpreter)와 JIT(Just-In-Time) 컴파일러가 존재한다.
자바 프로그램이 실행되는 과정을 단계별로 정리하면 다음과 같다.
1️⃣ 소스 코드 작성 (.java
파일)
Main.java
2️⃣ 컴파일 (.class
파일 생성)
javac
)가 .java
파일을 바이트코드(.class 파일)로 변환한다. 3️⃣ 클래스 로딩
.class
파일을 메모리에 로드한다. 4️⃣ 바이트코드 실행
JVM은 단순한 프로그램 실행기가 아니라, 다양한 기능을 제공하는 강력한 실행 환경이다.
자바 개발을 하면서 JVM의 동작을 이해하면, 프로그램의 성능 최적화, 메모리 관리, 실행 흐름을 더 효과적으로 컨트롤할 수 있다.
따라서 JVM 구조를 잘 이해하는 것이 자바 개발자로서 중요한 기본 지식이 된다.