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

동작 과정
- 클래스 로딩 (Class Loader)
- .class 파일(바이트코드)을 JVM으로 로드
- 바이트코드 검증 (Bytecode Verifier)
- Execution Engine 실행
- 인터프리터가 실행 (처음 실행)
- JIT 컴파일러가 최적화 (반복 실행되는 코드)
- Garbage Collector가 메모리 정리
Interpreter(인터프리터)
- 바이트코드를 한 줄씩 기계어로 변환하여 실행
- 처음 실행할 때 빠르지만, 반복 실행 시 속도가 느려짐
- 단점: 같은 코드가 반복될 때마다 계속 변환해야 하므로 성능 저하
JIT Compiler
- 인터프리터의 단점을 보완하기 위해 자주 실행되는 코드(핫스팟 코드)를 미리 컴파일
- 바이트코드를 한 번에 기계어로 변환한 후 캐싱하여 재사용
- 장점: 초기 실행은 느리지만, 반복 실행 시 속도가 빠름
- JVM이 코드를 처음 실행할 때 인터프리터가 동작
- 동일한 코드가 여러 번 실행되면 JIT 컴파일러가 감지
- 해당 바이트코드를 기계어로 변환하여 캐싱
- 이후에는 변환된 기계어를 사용하여 실행 (속도 향상)
Garbage Collector(GC)
Garbage Collector(GC)은 더 이상 사용되지 않는 객체를 자동으로 메모리에서 해제하는 JVM의 메모리 관리 기능
- 메모리 관리를 담당
- 불필요한 객체를 찾아서 제거하여 메모리 누수 방지
- 단점 : GC 발생 시 애플리케이션 멈춤 (Stop-the-World)
-
종류
- 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
- 적합한 환경:
- 단일 코어 시스템
- 작은 메모리 용량을 가진 애플리케이션
- Parallel GC (멀티스레드, Throughput 우선)
-
특징
- 멀티스레드를 사용하여 GC 작업을 수행
- Throughput(처리량) 우선 설계
- GC 시간이 길어도 상관없는 배치 작업(Batch Job)이나 서버 애플리케이션에 적합
-
동작 방식:
- Young Generation에서 여러 개의 스레드를 활용하여 GC 수행
- Old Generation에서도 멀티스레드로 Full GC 수행
-
사용 옵션:
-XX:+UseParallelGC
- 적합한 환경:
- 멀티코어 CPU 환경
- 처리량(Throughput) 중요
- Stop-the-World 시간이 길어도 되는 시스템 (배치 처리, 백엔드 서버)
- 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 시간을 최소화해야 하는 애플리케이션
- ZGC (Z Garbage Collector)
-
특징
- Pause time이 1~2ms 수준으로 매우 짧음
- 병렬 & 비동기 방식으로 GC 수행 → 대부분의 GC 작업을 애플리케이션과 병렬 실행
- Heap 크기가 수백 GB~TB까지 확장 가능
-
사용 옵션:
-XX:+UseZGC
- 적합한 환경
- 극단적으로 낮은 지연 시간(Low Latency) 요구 시스템
- 대용량 데이터 처리 시스템 (Heap 크기 수십 GB~TB 수준)
- 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