🧠 AOT vs JIT 컴파일 — 핵심 정리
1️⃣ AOT (Ahead-Of-Time Compilation)
1) 개념
- 실행 전에 미리 컴파일
- 소스코드 → 기계어(native code) 로 사전 변환 후 실행
2) 동작 흐름
소스코드 → (컴파일) → 기계어 실행파일 → 실행
3) 특징
- 실행 시 추가 컴파일 없음 → 즉시 실행
- 런타임 오버헤드 없음
- 플랫폼 의존적 (OS/CPU마다 빌드 필요)
4) 장점
- 빠른 시작 속도 (Startup Time 우수)
- 예측 가능한 성능
- 런타임 환경 단순 (VM 불필요)
5) 단점
- 실행 중 최적화 불가능
- 환경 변화에 대응 못함
- 빌드 시간이 길어질 수 있음
6) 대표 사례
- C
- C++
- Go
- GraalVM Native Image (Java AOT)
2️⃣ JIT (Just-In-Time Compilation)
1) 개념
- 실행 중에 컴파일
- 바이트코드 → 실행 시점에 기계어로 변환
2) 동작 흐름
소스코드 → (컴파일) → 바이트코드 → (실행 중 JIT 컴파일) → 기계어 실행
3) 특징
- 런타임에 실제 사용 패턴 기반 최적화
- VM(Java VM 등) 필요
- 초기 실행 시 느림 (워밍업 필요)
4) 장점
- 실행 중 최적화 가능 (HotSpot 최적화)
- 플랫폼 독립성 (Write Once Run Anywhere)
- 반복 실행될수록 성능 향상
5) 단점
- 초기 실행 속도 느림
- 런타임 메모리 사용 증가
- VM 의존성
6) 대표 사례
- Java (JVM)
- C# (.NET CLR)
- V8 (JavaScript 엔진)
3️⃣ 핵심 차이 비교
구분 | AOT | JIT |
컴파일 시점 | 실행 전 | 실행 중 |
실행 속도 | 빠름 (초기부터) | 점점 빨라짐 |
시작 속도 | 매우 빠름 | 느림 (워밍업 필요) |
최적화 | 제한적 | 동적 최적화 가능 |
플랫폼 의존성 | 높음 | 낮음 |
실행 환경 | 단순 | VM 필요 |
4️⃣ 현실적인 관점 (중요)
단순 비교는 의미 없다. 실제 시스템에서는 혼합 전략이 일반적이다.
1) 예: Java
- 기본: JIT (HotSpot)
- 옵션: AOT (GraalVM Native Image)
⬇️
- 빠른 시작이 중요 → AOT
- 장기 실행 + 고성능 → JIT
5️⃣ 실무 판단 기준
1) AOT가 유리한 경우
- 서버리스 (Lambda, Cloud Functions)
- CLI 도구
- 컨테이너 빠른 기동 필요
- 메모리 제한 환경
2) JIT가 유리한 경우
- 장시간 실행 서버
- 트래픽이 많은 백엔드
- 반복 연산 많음 (Hot code 존재)
6️⃣ 한 줄 정리
- AOT: “미리 만들어놓고 바로 실행”
- JIT: “실행하면서 똑똑하게 최적화”
Share article