본문 바로가기
정리

JVM

by dyddyd0 2025. 2. 26.

JVM에 대해 알아보자.

 

jvm 이란??

 

Java Virtural Machine의 약자이며, 이 jvm을 통해서 Java가 OS에 독립적으로 작동할 수 있다.

.java파일(자바 소스 코드)을 javac(자바컴파일러)가 .class파일(자바바이트코드)로 변경해 주고,
jvm은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행한다.


동작과정

 

1. 소스 코드 작성 및 컴파일 (Compilation)

  • 개발자는 Java 소스 코드(.java 파일)를 작성한 후, 이를 javac(Java Compiler)를 이용해 컴파일한다.
  • 컴파일이 완료되면 바이트 코드(.class 파일)가 생성된다.
  • 바이트 코드는 JVM에서 실행될 준비가 된 중간 코드(중간 언어)이다.

2. 클래스 로딩 (Class Loading)

  • JVM이 실행되면, 클래스 로더(Class Loader)가 필요한 .class 파일을 메모리에 로드한다.
  • 클래스 로딩 과정은 세 단계로 이루어진다:
    1. 로딩 (Loading)
      • 바이트 코드를 JVM의 메모리에 적재한다.
    2. 링크 (Linking)
      • 검증 (Verification): 바이트 코드가 유효한지 검증한다.
      • 준비 (Preparation): 클래스 변수(static 변수)들을 메모리에 할당하고 기본값으로 초기화한다.
      • 해결 (Resolution): 모든 심볼릭 참조를 실제 메모리 주소로 변환한다.
    3. 초기화 (Initialization)
      • static 변수의 초기화 및 static 블록을 실행한다.

3. 런타임 데이터 영역 할당 (Runtime Data Area)

    JVM은 실행을 위해 메모리를 여러 영역으로 나누어 관리한다.

  • 메서드 영역(Method Area)
    • 클래스의 구조(메서드, 필드 정보 등)를 저장하는 공간
    • static 변수도 저장됨
  • 힙(Heap)
    • new 키워드로 생성한 객체가 저장되는 공간
    • GC(Garbage Collector)가 관리하는 영역
  • 스택(Stack)
    • 메서드 호출 시 생성되는 스택 프레임(지역 변수, 매개변수, 연산 중간 값 등)이 저장됨
  • PC 레지스터(PC Register)
    • 현재 실행 중인 JVM 명령어 주소를 저장
  • 네이티브 메서드 스택(Native Method Stack)
    • 자바가 아닌 네이티브 코드(C, C++ 등) 실행을 위한 스택

4. 바이트 코드 실행 (Execution)

  • JVM의 실행 엔진(Execution Engine) 이 바이트 코드를 읽고 실행한다.
  • 실행 방식은 다음과 같다.
    • 인터프리터 (Interpreter)
      • 한 줄씩 바이트 코드를 읽고 해석 후 실행 (빠른 시작, 느린 실행)
    • JIT (Just-In-Time) 컴파일러
      • 실행 중에 바이트 코드를 기계어로 변환하여 성능을 최적화 (느린 시작, 빠른 실행)
      • HotSpot JVM에서는 자주 실행되는 코드를 기계어로 변환하여 실행 속도를 높인다.

5. 가비지 컬렉션 및 종료 (Garbage Collection & Termination)

  • JVM은 사용되지 않는 객체를 GC(Garbage Collector)를 통해 자동으로 정리한다.
  • 프로그램이 종료되면 JVM도 함께 종료된다.

 


 

 

JVM 구조
┌──────────────────────────────────────┐
│               JVM                    │
├───────────────┬──────────────────────┤
│ **클래스 로더 (Class Loader)**       ㅣ  ← .class 파일 로드 및 링크
├───────────────┼──────────────────────┤
│ **메모리 영역 (Runtime Data Area)**  ㅣ
│   ├── 메서드 영역 (Method Area)      ㅣ  ← 클래스 정보, static 변수 저장
│   ├── 힙 (Heap)                      │  ← 객체 저장 (new 키워드)
│   ├── 스택 (Stack)                   │  ← 메서드 호출 정보 저장
│   ├── PC 레지스터 (PC Register)      ㅣ  ← 현재 실행 명령어 위치
│   ├── 네이티브 메서드 스택 (Native)   │  ← 네이티브 코드 실행
├───────────────┼──────────────────────┤
│ **실행 엔진 (Execution Engine)**     ㅣ
│   ├── 인터프리터 (Interpreter)       ㅣ  ← 바이트 코드 한 줄씩 해석 실행
│   ├── JIT 컴파일러 (JIT Compiler)    ㅣ  ← 자주 실행되는 코드 최적화
│   ├── 가비지 컬렉터 (GC)             ㅣ  ← 사용하지 않는 객체 정리
├───────────────┼──────────────────────┤
│ **네이티브 인터페이스 (JNI)**         │  ← C, C++ 등 네이티브 코드 호출
└──────────────────────────────────────┘

 

 

 

 

 

이상 JDK의 Java Runtime Environment 내부의 jvm에 대해 알아보았다.

출처 - 얄팍한 코딩사전(https://www.youtube.com/watch?v=OxvtGYvVkRU)

 

반응형

'정리' 카테고리의 다른 글

URL 입력부터 페이지 렌더링까지  (1) 2025.04.07
포트포워딩, TCP/IP  (0) 2025.03.19
Thread  (0) 2025.03.05
Java Garbage Collector  (0) 2025.02.27
REST API  (0) 2025.02.25