백엔드API
4

JVM 은 뭘까?

JVM이란 무엇인지, 더 나아가 동작 원리에 대해서 알아보겠습니다.

JVM 은 뭘까?

JVM이 뭔가요?

한마디로 "자바 프로그램을 실행시켜주는 프로그램이예요."

컴퓨터는 자바 코드를 바로 이해하지 못해요.
그래서 JVM이 중간에서 통역사 역할을 해줘요.


왜 사용하나요?

자바가 없던 시절에는 다음과 같은 문제가 발생했었어요.

Window에서 만든 프로그램  → Mac에서 실행 안 됨
Mac 용으로 만든 프로그램  → Linux에서 실행 안 됨

JVM을 사용하면?

OS마다 JVM만 설치하면, 같은 코드가 어디서든 동작해요.
이게 자바의 유명한 슬로건 "Write Once, Run Anywhere" 예요.


JDK 설치하면 들어있는 것들

image


image

핵심 도구 설명

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가 알아서 주기적으로 청소해줘요


전체 흐름 한눈에 보기

image


질문

Q. 인터프리터 방식이란 뭔가요?
A. 한마디로 "코드를 한 줄씩 읽고 바로 실행하는 방식"이에요.

Q. JIT이 뭔가요?
A. 자주 쓰이는 코드를 미리 번역해서 저장해두는 기술이에요.
덕분에 반복 실행되는 코드를 훨씬 빠르게 처리할 수 있어요.

댓글

(0)