JIT 컴파일(Just-In-Time Compilation)은 프로그램 실행 중에 바이트코드나 중간 표현을 네이티브 기계어로 동적 컴파일하는 기법이다. 인터프리터의 이식성과 정적 컴파일러의 성능을 결합한다.
인터프리터 vs AOT vs JIT
인터프리터:
소스/바이트코드 → 한 줄씩 해석 실행
장: 이식성, 빠른 시작 | 단: 느림
AOT 컴파일러 (Ahead-of-Time):
소스 → 배포 전 네이티브 코드 생성
장: 최고 성능, 빠른 시작 | 단: 플랫폼 종속
JIT 컴파일러:
런타임에 핫 코드(자주 실행되는 코드)를 네이티브로 컴파일
장: 런타임 정보 활용, 이식성 | 단: 웜업 시간
동작 원리
1. 프로파일링: 자주 실행되는 코드(핫스팟) 감지
2. 컴파일: 핫스팟을 네이티브 코드로 컴파일
3. 캐시: 컴파일된 코드를 캐시에 저장
4. 실행: 이후 호출 시 캐시된 네이티브 코드 실행
최적화 기법:
- 인라이닝 (inline 함수 호출 제거)
- 이스케이프 분석 (힙 할당 최소화)
- 추측 최적화 + 탈최적화 (deoptimization)
주요 JIT 구현
| 환경 | JIT 구현 | 특징 |
|---|
| JVM | HotSpot C1/C2 | 2단계 컴파일 |
| V8 (JavaScript) | TurboFan | 타입 추론 활용 |
| .NET CLR | RyuJIT | 타입 안정적 코드 |
| PyPy | RPython JIT | CPython 대비 510배 빠름 |
| LuaJIT | Trace JIT | 고성능 Lua 실행 |
Java HotSpot 2단계
인터프리터 → C1 컴파일 (빠른 컴파일, 기본 최적화)
→ C2 컴파일 (느린 컴파일, 적극적 최적화)
→ 핫스팟 임계치 도달 시 단계 전환
관련 개념