포스트

JVM

JVM

JVM

1. JVM이란?

JVM (Java Virtual Machine)은 자바 프로그램을 OS와 무관하게 실행할 수 있도록 만들어주는 가상 머신(Virtual Machine) 이다.

  • 자바는 소스코드를 컴파일하면 바이트코드 (.class) 를 생성
  • 이 바이트코드는 JVM 위에서 실행된다
  • 따라서 한 번 작성한 코드가 다양한 플랫폼에서 동작할 수 있음

    슬로건: “Write Once, Run Anywhere”

2. JVM의 전체 실행 흐름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[.java 소스 코드]
      ↓ (컴파일)
[javac 컴파일러]
      ↓
[.class 바이트코드]
      ↓
[Class Loader]
      ↓
[Runtime Data Area (JVM 메모리)]
      ↓
[Execution Engine]
      ↓
[실제 실행 결과]

JVM 구조

위의 다이어그램은 JVM의 전체적인 다이어그램이다. CLass Loader 부터 하나하나씩 어떠한 역할을 하는지 알아보자 😛

3. Class Loader

JVM은 클래스 파일을 Class Loader를 통해 메모리에 적재한다. 이 모듈은 클래스를 읽어들이고 준비시키는 단계다.

Class Loader의 동작 과정

단계설명
로딩 (Loading).class 파일을 읽고 Method Area에 클래스 정보 저장
링크 (Linking)검증 → 준비(static 메모리 확보) → 심볼릭 참조 해결 순서대로 진행
초기화 (Initialization)static 필드 값 설정, static 블록 실행 등 초기 실행 준비

Class Loader 계층 구조

1
2
3
4
5
6
7
8
Bootstrap ClassLoader
        ↓
Extension ClassLoader
        ↓
Application ClassLoader
        ↓
Custom ClassLoader (선택)

Class Loader설명
BootstrapJVM 내부 핵심 클래스 로딩 (java.lang., java.util.)
Extensionlib/ext 폴더에 위치한 확장 클래스 로딩
Application사용자 애플리케이션 클래스 로딩 (classpath 기반)
Custom직접 구현하여 동적 로딩, 보안 기능, 플러그인 구조 등에 활용 가능

4. Runtime Data Area: JVM 메모리 구조

JVM은 자바 애플리케이션 실행 시 다음과 같은 메모리 영역을 사용한다.

JVM 메모리 구조 흐름도

1
2
3
4
5
[Method Area]       ← 클래스 구조 정보 (모든 스레드 공유)
[Heap]              ← 객체 인스턴스 저장 (모든 스레드 공유)
[Stack (Thread별)]  ← 메서드 호출 정보, 지역 변수 등 (스레드 개별)
[PC Register]       ← 현재 실행 중인 명령어 주소 (스레드 개별)
[Native Stack]      ← C/C++ 네이티브 메서드 실행용 공간 (스레드 개별)

영역 설명

  • Method: Area 클래스의 구조 정보 저장 (메서드, 필드, 상수, static 변수 등)
  • Heap: new 키워드로 생성된 객체 인스턴스가 저장됨
  • Stack: 메서드 호출 시 생성되는 스택 프레임 저장, 지역 변수, 매개변수 등
  • PC Register: 현재 실행 중인 명령어의 주소 저장 (스레드별로 존재)
  • Native Method Stack: C/C++ 등 네이티브 메서드 실행을 위한 공간

5. Execution Engine: 실행 엔진

클래스를 JVM 메모리에 올리고 나면, 실제 실행은 Execution Engine에서 이루어진다.

1
2
3
4
5
[바이트코드] 
   ↓
[Execution Engine]
   ↓
[네이티브 명령 실행]

Execution Engine 구성 요소

구성 요소설명
인터프리터바이트코드를 한 줄씩 해석하며 실행 (느림)
JIT반복되는 코드를 네이티브 코드로 컴파일하여 캐싱 (빠름)
GC가비지 컬렉션과 협력하여 메모리 관리

JIT(Just-In-Time) 컴파일러

  • 바이트코드를 네이티브 코드로 변환해서 빠르게 실행
  • 성능 향상을 위해 HotSpot JVM에서 자주 사용됨

GC: Garbage Collector

GC (Garbage Collector) 는 더 이상 사용하지 않는 객체를 자동으로 메모리에서 제거한다.

1
2
3
4
5
6
[Heap 영역]
   ↓ (사용 X)
[GC 감지]
   ↓
[객체 제거 → 메모리 회수]

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.