토픽 107 / 111·코드 실행 체계 (Code Execution Model)
JIT 컴파일 (Just-In-Time Compilation)
JIT 컴파일 (Just-In-Time Compilation)
프로그램 실행 시점에 바이트코드나 중간 코드를 기계어로 동적 번역하는 컴파일 기법으로, 인터프리터의 유연성과 컴파일러의 실행 속도를 결합한 하이브리드 방식
목적: 실행 속도 향상, 런타임 최적화, 플랫폼 적응, 핫스팟 최적화
특징: 실행 시 컴파일, 프로파일 기반 최적화(PGO), 핫코드 감지, 적응적 최적화, 코드 캐싱
동작 과정: ① 바이트코드 인터프리팅 → ② 핫스팟(자주 실행되는 코드) 감지 → ③ JIT 컴파일(기계어 변환) → ④ 최적화(인라이닝/루프 언롤링/타입 특화) → ⑤ 캐싱 및 재사용
최적화 기법
- •인라인 캐싱(Inline Caching): 메서드 호출 최적화, 타입 추론
- •이스케이프 분석(Escape Analysis): 객체의 힙 할당 제거, 스택 할당으로 전환
- •루프 최적화: 언롤링, 벡터화, 루프 불변식 이동
- •투기적 최적화(Speculative Optimization): 런타임 프로파일 기반 가정, 탈최적화(Deoptimization) 가능
계층형 컴파일(Tiered Compilation): C1(빠른 컴파일/기본 최적화) → C2(느린 컴파일/고급 최적화), 실행 빈도에 따라 단계 상승
주요 JIT 엔진: HotSpot JVM(Java/C1+C2), V8(JavaScript/TurboFan), GraalVM(다중 언어/Truffle), PyPy(Python/메타트레이싱), .NET RyuJIT(C#)
장점: 높은 실행 성능, 런타임 최적화, 적응적 코드 생성, 프로파일 기반 최적화
단점: 웜업 시간(Cold Start), 메모리 사용 증가, 컴파일 오버헤드, 예측 불가 지연
비교: JIT(실행시컴파일/런타임최적화/웜업) vs AOT(사전컴파일/즉시실행/정적최적화) vs 인터프리터(번역없음/느림/유연)
연관: AOT, 바이트코드, 가상머신, HotSpot, V8, GraalVM