서은파파의 추월차선

[자바/Java/면접] JVM의 구조와 동작 원리 본문

면접대비

[자바/Java/면접] JVM의 구조와 동작 원리

seoeunpapa 2025. 1. 19. 23:33
728x90

JVM의 구조와 동작 원리

JVM은 Java 애플리케이션을 실행하기 위한 가상 머신으로, OS와 독립적으로 동작하며 바이트코드(Bytecode)를 해석하고 실행하는 역할을 합니다.

1. JVM의 주요 구성 요소

JVM은 크게 다음과 같은 주요 컴포넌트들로 구성됩니다.

  1. Class Loader
    • .class 파일을 로드하고, 메모리에 적재하는 역할
    • 로딩(Loading) → 링크(Linking) → 초기화(Initialization) 단계로 진행
    • Lazy Loading 방식으로 필요할 때 클래스를 로드
    • 부모-자식 계층 구조를 가지며, Bootstrap ClassLoader → Extension ClassLoader → Application ClassLoader 순으로 동작
  2. Runtime Data Area (메모리 구조)
    JVM의 메모리 영역은 여러 가지로 나뉘어 있습니다.
    • Method Area (메소드 영역, 클래스 메타데이터 저장)
      • 클래스 정보, 메소드, static 변수 등이 저장됨
      • HotSpot JVM에서는 Metaspace로 대체됨
    • Heap Area (힙 영역, 객체 저장소)
      • GC(Garbage Collection)의 주요 대상
      • Young Generation(Eden, Survivor)과 Old Generation으로 구분됨
    • Stack Area (스택 영역, 쓰레드별 스택 프레임)
      • 메소드 호출 시 스택 프레임이 생성되며, 지역 변수, 메소드 호출 정보 저장
      • 각 쓰레드는 독립적인 스택을 가짐
    • PC Register (프로그램 카운터 레지스터)
      • 현재 실행 중인 바이트코드의 주소 저장
    • Native Method Stack (네이티브 메소드 스택)
      • C, C++ 같은 네이티브 코드 실행을 위한 스택
  3. Execution Engine (실행 엔진)
    • 바이트코드를 실행하는 엔진으로, 인터프리터(Interpreter) + JIT(Just-In-Time) Compiler로 구성됨
    • 인터프리터: 바이트코드를 한 줄씩 해석하여 실행 (속도가 느림)
    • JIT 컴파일러: 자주 실행되는 코드를 기계어로 변환해 성능을 최적화
    • HotSpot Compiler: 실행 빈도가 높은 코드를 네이티브 코드로 변환하여 실행 속도를 높임
  4. Garbage Collector (GC, 가비지 컬렉터)
    • 사용되지 않는 객체를 자동으로 제거하여 메모리를 관리
    • 대표적인 GC 알고리즘
      • Serial GC: 단일 스레드 환경, stop-the-world 발생
      • Parallel GC: 다중 스레드 활용, Throughput 중점
      • G1(Garbage First) GC: 최신 GC, 낮은 stop-the-world 시간 보장
  5. Native Interface (JNI, Java Native Interface)
    • Java에서 C, C++ 등의 네이티브 코드를 호출할 수 있도록 지원

2. JVM의 실행 과정

JVM이 Java 프로그램을 실행하는 과정은 다음과 같습니다.

  1. 소스 코드 작성 → 컴파일 → 바이트코드 생성
  2. javac HelloWorld.java # HelloWorld.class 생성
  3. Class Loader가 바이트코드(.class)를 JVM 메모리에 로드
    • 로드된 클래스는 Method Area에 저장
  4. Execution Engine이 바이트코드를 실행
    • 인터프리터가 즉시 실행
    • 반복 실행되는 코드는 JIT 컴파일러가 최적화
  5. 메모리 관리 (GC가 불필요한 객체 정리)

3. JVM의 특징

  • 플랫폼 독립성: "Write Once, Run Anywhere"
  • 자동 메모리 관리: GC를 통한 자동화된 메모리 관리
  • JIT 컴파일러 활용: 성능 최적화

추가 예상 질문

  1. JIT 컴파일러의 동작 방식은?
    • JIT는 바이트코드를 네이티브 코드로 변환하는 컴파일러이며, 실행 중인 프로그램에서 자주 호출되는 코드를 최적화하여 성능을 향상시킵니다.
    • 대표적인 기법으로 인라이닝(Inlining), 루프 최적화(Loop Optimization) 등이 있습니다.
  2. GC 튜닝을 어떻게 진행하나요?
    • GC 로그 분석 (-XX:+PrintGCDetails)
    • GC 알고리즘 선택 (-XX:+UseG1GC)
    • Heap Size 조정 (-Xms, -Xmx 옵션)

 

 

 

728x90