JVM 은 뭘까?
JVM이란 무엇인지, 더 나아가 동작 원리에 대해서 알아보겠습니다.
JVM이 뭔가요?
한마디로 "자바 프로그램을 실행시켜주는 프로그램이예요."
컴퓨터는 자바 코드를 바로 이해하지 못해요.
그래서 JVM이 중간에서 통역사 역할을 해줘요.
왜 사용하나요?
자바가 없던 시절에는 다음과 같은 문제가 발생했었어요.
Window에서 만든 프로그램 → Mac에서 실행 안 됨
Mac 용으로 만든 프로그램 → Linux에서 실행 안 됨
JVM을 사용하면?
OS마다 JVM만 설치하면, 같은 코드가 어디서든 동작해요.
이게 자바의 유명한 슬로건 "Write Once, Run Anywhere" 예요.
JDK 설치하면 들어있는 것들


핵심 도구 설명
java - 실행
java Hello # Hello 실행
JVM을 구동시켜서 프로그램을 실행해요
javac - 컴파일러
javac Hello.java # Hello.class 생성
.java 파일을 바이트코드(.class)로 변환해요
jar - 압축 도구
jar -cf MyApp.jar *.class # .class 파일들을 하나로 묶음
여러 .class 파일을 하나의 .jar 파일로 묶어요
우리가 Maven/Gradle에서 받는 라이브러리가 바로 .jar예요
javadoc - 문서 생성기
public int add(int a, int b) { ... }
주석을 기반으로 자동으로 API 문서를 만들어줘요
어떤 흐름으로 동작해?
1단계 - 코드 작성
System.out.println("Hello!");
우리가 작성하는 .java 파일이예요
2단계 - 컴파일
Hello.java → (javac 컴파일) → Hello.class
javac가 우리 코드를 바이트코드로 변환해요
바이트코드는 OS에 상관없이 동작할 수 있어요
3단계 - JVM이 실행
Hello.class
↓
① Class Loader → "이 파일 메모리에 올릴게요"
↓
② 메모리에 배치 → "변수, 객체들 여기다 저장할게요"
↓
③ 실행 엔진 → "바이트코드 읽어서 실제로 실행할게요"
↓
Hello! 출력
JVM 구성 요소
JVM은 단순히 코드만 실행하는 게 아니라 메모리 공간 관리까지 전부 담당해요.
각각 어떤 역할을 하는지 살펴볼게요
1. Class Loader - 클래스 파일 로드
".class 파일을 JVM 메모리에 올려주는 역할"
Hello.class 파일 (하드디스크에 저장되어 있음)
↓
Class Loader가 읽어서
↓
JVM 메모리에 올림
책장에 있는 책을 꺼내서 책상 위에 올려두는 것과 같아요.
2. Method Area - 클래스 정보 저장
"클래스 설계도, static 변수를 보관하는 공간"
public class Car {
static int wheels = 4; // ← Method Area에 저장!
public void drive() { // ← 메서드 정보도 저장!
...
}
}
설계도 보관소예요.
new Car()로 객체를 만들 때 이 설계도를 참고해요
3. Heap - 객체 저장
"new로 만든 객체들이 저장되는 공간"
Car myCar = new Car(); // myCar 객체 → Heap에 저장!
Car yourCar = new Car(); // yourCar 객체 → Heap에 저장!
창고예요.
new로 만든 물건(객체)들을 전부 여기다 쌓아두고,
GC가 주기적으로 와서 안 쓰는 객체를 청소해줘요
4. Stack - 메서드 실행
"메서드가 실행될 때 지역변수들이 저장되는 공간"
void add(int a, int b) {
int result = a + b; // a, b, result → Stack에 저장
return result;
} // 메서드 끝나면 Stack에서 자동 삭제
책상 위예요.
지금 당장 필요한 것만 올려두고,
메서드가 종료되면 바로 치워버려요
5. 실행 엔진 - 인터프리터 + JIT
"바이트코드를 실제로 실행하는 역할"
처음엔 인터프리터 방식으로 한 줄씩 읽어요.
그런데 자주 쓰는 코드가 생기면?
자주 호출되는 코드 발견
↓
JIT 컴파일러가 통째로 네이티브 코드로 변환
↓
다음번엔 변환 없이 바로 실행
처음엔 매뉴얼 보면서(인터프리터) 일하다가
자주 하는 일은 외워서(JIT) 빠르게 처리해요
6. GC (Garbage Collector) - Heap 청소
"사용하지 않는 객체를 Heap에서 자동으로 제거하는 역할"
자바는 메모리를 직접 관리 안 해도 돼요.
// C언어는 직접 해제해야 함
free(memory);
// 자바는 JVM이 알아서 해줌
// 아무것도 안 해도 됨
void someMethod() {
Car myCar = new Car(); // Heap에 객체 생성
// myCar 사용...
}
// 메서드 종료 → myCar를 아무도 참조 안 함
// GC가 발견 → Heap에서 자동 삭제
개발자가 직접 메모리를 해제 안 해도
GC가 알아서 주기적으로 청소해줘요
전체 흐름 한눈에 보기

질문
Q. 인터프리터 방식이란 뭔가요?
A. 한마디로 "코드를 한 줄씩 읽고 바로 실행하는 방식"이에요.
Q. JIT이 뭔가요?
A. 자주 쓰이는 코드를 미리 번역해서 저장해두는 기술이에요.
덕분에 반복 실행되는 코드를 훨씬 빠르게 처리할 수 있어요.