[JAVA]JVM이란?(3)-Execution Engine

bbbbbhyun·2025년 2월 18일
0

JAVA

목록 보기
4/5

Execution Engine

JVM이 .class 파일(바이트코드)을 직접 실행할 수 없으므로, Execution Engine이 바이트코드를 기계어로 변환하여 실행하고 Interpreter, JIT Compiler, Garbage Collector로 구성

동작 과정

  1. 클래스 로딩 (Class Loader)
  • .class 파일(바이트코드)을 JVM으로 로드
  1. 바이트코드 검증 (Bytecode Verifier)
  • 바이트코드가 JVM 규칙을 준수하는지 확인
  1. Execution Engine 실행
  • 인터프리터가 실행 (처음 실행)
  • JIT 컴파일러가 최적화 (반복 실행되는 코드)
  • Garbage Collector가 메모리 정리

Interpreter(인터프리터)

  • 특징
  1. 바이트코드를 한 줄씩 기계어로 변환하여 실행
  2. 처음 실행할 때 빠르지만, 반복 실행 시 속도가 느려짐
  3. 단점: 같은 코드가 반복될 때마다 계속 변환해야 하므로 성능 저하

JIT Compiler

  • 특징
  1. 인터프리터의 단점을 보완하기 위해 자주 실행되는 코드(핫스팟 코드)를 미리 컴파일
  2. 바이트코드를 한 번에 기계어로 변환한 후 캐싱하여 재사용
  3. 장점: 초기 실행은 느리지만, 반복 실행 시 속도가 빠름
  • 동작 과정
  1. JVM이 코드를 처음 실행할 때 인터프리터가 동작
  2. 동일한 코드가 여러 번 실행되면 JIT 컴파일러가 감지
  3. 해당 바이트코드를 기계어로 변환하여 캐싱
  4. 이후에는 변환된 기계어를 사용하여 실행 (속도 향상)

Garbage Collector(GC)

Garbage Collector(GC)은 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하는 JVM의 메모리 관리 기능

  • 특징
  1. 메모리 관리를 담당
  2. 불필요한 객체를 찾아서 제거하여 메모리 누수 방지
  3. 단점 : GC 발생 시 애플리케이션 멈춤 (Stop-the-World)
  • 청소 방식

    1. Mark and Sweep

      • Mark(마킹 단계): GC 루트(Root Set)에서 접근할 수 있는 객체를 마킹
      • Sweep(스위프 단계): 마킹되지 않은 객체(Unreachable)를 메모리에서 해제
      • 장점
        1. 참조 카운팅 방식보다 순환 참조 문제 해결 가능
          1. 간단한 구현
      • 단점
        1. 메모리 단편화(Fragmentation) 발생 : 객체를 단순히 제거하는 방식이므로, 해제된 공간이 단편화될 가능성이 큼
        2. GC가 실행될 때 일시적으로 애플리케이션이 멈춤(Stop-the-World, STW)
    2. Mark and Compact

      • Mark(마킹 단계): GC 루트에서 접근 가능한 객체를 마킹
      • Compact(압축 단계): 남아 있는 객체를 한쪽으로 압축하여 이동
      • Sweep(스위프 단계): 마킹되지 않은 객체를 해제하고 메모리 단편화를 방지
      • 장점
        1. 메모리 단편화 방지 → 객체를 한쪽으로 이동시켜 연속된 메모리 공간 확보
        2. Mark and Sweep보다 효율적
      • 단점
        1. 객체를 이동하는 오버헤드 발생
        2. GC 실행 시간이 상대적으로 길어질 수 있음
  • 동작 과정
    JVM의 Heap 영역은 Young Generation과 Old Generation으로 나뉘며, GC는 각 세대에서 다르게 동작

    1. Young GC
    • 대상: Young Generation(Eden + Survivor 영역)

    • 특징

      • Young Generation에서 발생하는 GC
      • 비교적 가벼운 GC로, 속도가 빠름
      • Copying GC 방식 사용 → Eden에서 살아남은 객체를 Survivor 영역으로 이동
      • 일정 시간 생존한 객체는 Old Generation으로 승격(Promotion)
    • Young GC 실행 과정

      1. 객체가 Eden 영역에 생성
      2. Eden 영역이 가득 차면 Young GC 발생
      3. 살아남은 객체를 Survivor 영역으로 복사
      4. 여러 번 Young GC를 거친 객체는 Old Generation으로 이동
    1. Old GC
    • 대상: Old Generation 전체

    • 특징

      • Old Generation에서 발생하는 GC
      • Young GC보다 GC 실행 시간이 길고, Stop-the-World 시간이 더 길어짐
      • Mark-Sweep-Compact 방식을 사용하여 메모리 단편화 해결
    • Full GC 실행 과정

      1. Mark 단계 → GC 루트에서 접근 가능한 객체를 마킹
      2. Sweep 단계 → 접근 불가능한 객체를 정리
      3. Compact 단계 → 살아남은 객체를 한쪽으로 이동하여 단편화 해결
    • 문제점

      • 애플리케이션이 일시적으로 멈춤(Stop-the-World, STW) 발생
      • Full GC가 자주 발생하면 시스템 성능 저하
  • 종류

    1. Serial GC (단일 스레드 환경)
    • 특징

      • 단일 스레드(single-threaded)로 GC 작업 수행
      • Young GC와 Full GC 모두 단일 스레드로 처리
      • Stop-the-World 시간이 길어질 수 있음
      • 작은 애플리케이션이나 단일 코어 환경에서 적합
    • 동작 방식

      • Young Generation에서 Minor GC 수행
      • Old Generation이 가득 차면 Full GC 실행
      • Full GC 실행 시 모든 애플리케이션 스레드가 멈춤(Stop-the-World, STW)
    • 사용 옵션:

    -XX:+UseSerialGC
    • 적합한 환경:
      • 단일 코어 시스템
      • 작은 메모리 용량을 가진 애플리케이션
    1. Parallel GC (멀티스레드, Throughput 우선)
    • 특징

      • 멀티스레드를 사용하여 GC 작업을 수행
      • Throughput(처리량) 우선 설계
      • GC 시간이 길어도 상관없는 배치 작업(Batch Job)이나 서버 애플리케이션에 적합
    • 동작 방식:

      • Young Generation에서 여러 개의 스레드를 활용하여 GC 수행
      • Old Generation에서도 멀티스레드로 Full GC 수행
    • 사용 옵션:

    -XX:+UseParallelGC
    • 적합한 환경:
      • 멀티코어 CPU 환경
      • 처리량(Throughput) 중요
      • Stop-the-World 시간이 길어도 되는 시스템 (배치 처리, 백엔드 서버)
    1. G1 GC (선택적 영역 GC)
    • 특징

      • Heap을 여러 개의 Region으로 분할하여 GC 수행
      • Stop-the-World 시간을 최소화하면서 효율적인 메모리 관리
      • 대용량 메모리 시스템에 적합
    • 동작 방식

      • Young, Old Generation을 물리적으로 구분하지 않고, Region 단위로 관리
      • Priority가 높은(가비지가 많은) Region부터 GC 수행 → "Garbage First"
      • Full GC를 최소화하며, Stop-the-World 시간이 짧음
    • 사용 옵션:

    -XX:+UseG1GC
    • 적합한 환경
      • 대규모 서버 환경 (Heap 크기가 4GB 이상인 경우)
      • 낮은 지연 시간(Low Latency) 요구 시스템
      • Stop-the-World 시간을 최소화해야 하는 애플리케이션
    1. ZGC (Z Garbage Collector)
    • 특징

      • Pause time이 1~2ms 수준으로 매우 짧음
      • 병렬 & 비동기 방식으로 GC 수행 → 대부분의 GC 작업을 애플리케이션과 병렬 실행
      • Heap 크기가 수백 GB~TB까지 확장 가능
    • 사용 옵션:

    -XX:+UseZGC
    • 적합한 환경
      • 극단적으로 낮은 지연 시간(Low Latency) 요구 시스템
      • 대용량 데이터 처리 시스템 (Heap 크기 수십 GB~TB 수준)
    1. Shenandoah GC
    • 특징
      • Concurrent Compaction 지원 → 압축(Compaction) 작업을 GC와 병렬 실행
      • GC 동작 중에도 애플리케이션이 실행 가능
      • Pause time이 Heap 크기에 비례하지 않음 (일정한 지연 시간 유지)
    • 사용 옵션
    -XX:+UseShenandoahGC
    • 적합한 환경
      • 초저지연(ultra-low-latency) 시스템
      • JVM이 대규모 Heap을 사용할 경우
      • 실시간 데이터 처리, 금융 거래 시스템 등

참고

https://ssdragon.tistory.com/28
https://junhyunny.github.io/information/java/jvm-execution-engine/
https://wonit.tistory.com/591
https://m.blog.naver.com/ksw6169/221647376178
https://velog.io/@nandong1104/Java%EB%A5%BC-%EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A7%84%ED%96%89%EC%9D%B4-%EB%90%98%EB%82%98%EC%9A%94-2-2.-JVM-Execution-Engine
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC
https://velog.io/@mooh2jj/JVM-GC%EC%9D%98-%EC%B2%98%EB%A6%AC-%EA%B3%BC%EC%A0%95
https://velog.io/@akfls221/JVM%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%B4-GC-%EA%B7%B8%EB%A6%AC%EA%B3%A0-GC-%ED%8A%9C%EB%8B%9D%EA%B9%8C%EC%A7%80

profile
BackEnd develope

0개의 댓글

관련 채용 정보