Java JIT Compiler 동작 원리 완벽 이해하기
많은 사람들이 Java를 처음 배울 때:
Java는 인터프리터 언어라 느리다
라고 생각합니다.
하지만 실제 운영 환경에서는 Java가:
- Spring Boot 서버
- 대규모 금융 시스템
- 고성능 게임 서버
- Kafka
- Elasticsearch
같은 초고성능 시스템에도 매우 많이 사용됩니다.
그 핵심 이유 중 하나가 바로:
JIT Compiler(Just-In-Time Compiler)
입니다.
실제로 JVM은 단순히 ByteCode를 해석만 하지 않습니다.
실행 중:
- 자주 실행되는 코드 탐지
- Native Machine Code 변환
- CPU 최적화
- 런타임 프로파일링
까지 수행합니다.
이번 글에서는:
- Interpreter vs JIT
- HotSpot JVM
- C1 / C2 Compiler
- Tiered Compilation
- Escape Analysis
- Deoptimization
까지 JVM 내부 관점으로 깊게 정리해보겠습니다.
1. JIT Compiler란?
Just-in-time compilation 는:
실행 중(ByteCode 실행 중)에 Native Machine Code로 컴파일하는 기술
입니다.
즉:
ByteCode 실행
↓
자주 실행되는 코드 발견
↓
기계어로 최적화 컴파일
↓
CPU 직접 실행
구조.
2. Java 실행 방식 다시 보기
Java 실행 흐름:
.java
↓
javac 컴파일
↓
.class(ByteCode)
↓
JVM 실행
3. ByteCode는 기계어가 아니다
매우 중요합니다.
.class 파일은:
CPU가 직접 실행 불가능
합니다.
즉 JVM이 실행 필요.
4. 초기 Java 실행 방식: Interpreter
초기 JVM은:
ByteCode 한 줄씩 해석 실행
했습니다.
5. Interpreter 방식 예시
예:
int sum = a + b;
실행 시마다:
ByteCode 읽기
↓
해석
↓
실행
반복.
6. Interpreter 장점
| 장점 | 설명 |
| 시작 빠름 | 컴파일 필요 없음 |
| 구현 단순 | O |
| 플랫폼 독립성 | O |
7. Interpreter 단점
문제:
반복 실행 시 느림
왜냐하면:
매번 해석 필요
하기 때문.
8. 그래서 등장한 JIT
핵심 아이디어:
“자주 실행되는 코드는
기계어로 바꾸자”
입니다.
9. HotSpot JVM
HotSpot JVM 은:
가장 대표적인 JVM 구현체
입니다.
여기서:
Hot Spot
이란:
자주 실행되는 코드 영역
의미.
10. HotSpot 탐지
JVM은 실행 중:
어떤 코드가 반복 실행되는가
계속 분석합니다.
11. 대표 대상
예:
- 반복문
- 자주 호출되는 메서드
- 빈번한 분기
12. Hot Method
반복 호출되면:
Hot Method
판단.
즉:
컴파일 가치 있음
으로 판단.
13. JIT 컴파일 수행
그 다음:
ByteCode
↓
Native Machine Code 변환
수행.
14. Native Code란?
실제 CPU가 직접 실행 가능한 코드.
즉:
x86
ARM
CPU 명령어 수준 코드.
15. 왜 빨라질까?
Interpreter:
매번 해석
필요.
JIT:
이미 컴파일된 기계어 직접 실행
가능.
16. 그래서 Java가 생각보다 빠르다
많은 경우 Java는:
C++ 수준 가까운 성능
도 가능.
특히 반복 로직.
17. JIT 동작 흐름
전체 구조:
ByteCode 실행
↓
Hot Spot 탐지
↓
JIT 컴파일
↓
Native Code 캐시
↓
이후 직접 실행
18. Native Code 저장 위치
컴파일 결과는:
Code Cache
영역 저장.
19. JVM이 “학습”한다는 의미
JIT는 실행 중:
- 호출 빈도
- 분기 패턴
- 타입 정보
등 계속 수집.
즉:
런타임 최적화
수행.
20. C1 Compiler
HotSpot 내부 JIT 중 하나.
특징:
빠른 컴파일
중심.
21. C2 Compiler
고급 최적화 담당.
특징:
느리지만 매우 강한 최적화
수행.
22. 왜 두 개 존재할까?
컴파일 전략 차이 때문.
| Compiler | 특징 |
| C1 | 빠른 컴파일 |
| C2 | 강한 최적화 |
23. Tiered Compilation
현대 JVM 핵심 전략.
구조:
처음엔 Interpreter
↓
C1 빠른 최적화
↓
충분히 Hot하면 C2 고급 최적화
24. 왜 이렇게 할까?
처음부터 C2 쓰면:
컴파일 비용 너무 큼
즉 startup 느려짐.
25. Inline Optimization
매우 중요한 최적화.
예:
add()
같은 작은 메서드.
JIT는:
메서드 호출 제거
가능.
26. 왜 중요할까?
메서드 호출도 비용 존재.
Inline하면:
직접 코드 삽입
가능.
27. Escape Analysis
Escape Analysis 는:
객체가 메서드 밖으로 나가는지 분석
기술.
28. 예시
void test() {
User user = new User();
}
만약 user가:
메서드 밖으로 안 나감
이면?
29. JVM 최적화 가능
JIT는:
Heap 객체 생성 생략
가능할 수도 있음.
즉:
Stack Allocation
최적화 가능.
30. Scalar Replacement
객체 자체 제거 가능.
예:
객체 → 개별 변수 치환
즉:
객체 생성 자체 제거
가능.
31. Lock Elision
동기화 제거 최적화.
예:
synchronized
지만 실제 경쟁 없으면:
락 제거 가능
32. Branch Prediction 최적화
JIT는:
어떤 if가 자주 실행되는가
분석 가능.
즉 CPU 친화적 코드 생성.
33. Deoptimization
매우 중요합니다.
JIT 가정이 틀리면:
최적화 취소
가능.
이를:
Deoptimization
이라고 함.
34. 왜 필요할까?
예:
“항상 Dog 타입”
이라 가정하고 최적화했는데:
Cat 등장
하면 최적화 깨짐.
35. JVM은 다시 Interpreter로 복귀 가능
즉:
최적화 실패
↓
안전한 코드로 롤백
가능.
36. Warm-up이란?
Java 서버는 보통:
초기 느림
↓
점점 빨라짐
현상 존재.
이유:
JIT 학습 및 최적화 시간 필요
하기 때문.
37. Benchmark 시 주의
실무에서 매우 중요.
Java 성능 테스트는:
Warm-up 없이 측정하면 부정확
가능.
38. JIT 관련 옵션
대표 옵션:
-XX:+PrintCompilation
설명:
| 옵션 | 의미 |
| -XX:+PrintCompilation | JIT 컴파일 로그 출력 |
39. Code Cache 관련 옵션
-XX:ReservedCodeCacheSize=256m
설명:
| 옵션 | 의미 |
| ReservedCodeCacheSize | JIT Code Cache 크기 |
40. 실무에서 자주 하는 실수
1) Java는 무조건 느리다고 생각
JIT 최적화 매우 강력.
2) Benchmark Warm-up 안 함
결과 왜곡 가능.
3) 객체 생성 비용 과소평가
JIT가 최적화해줄 수도 있지만 항상은 아님.
41. 핵심 흐름 요약
Interpreter 실행
↓
Hot Spot 탐지
↓
JIT 컴파일
↓
Native Code 생성
↓
CPU 직접 실행
42. 가장 중요한 핵심 한 줄
JIT는
“자주 실행되는 ByteCode를
실시간으로 기계어 최적화하는 JVM 엔진”
입니다.
43. 정리
JIT Compiler는 단순 성능 기능이 아닙니다.
실제로는:
- JVM 성능
- 런타임 최적화
- 객체 생성 최적화
- CPU 최적화
- 대규모 서버 처리 성능
전체와 연결되는 JVM 핵심 기술입니다.
특히 실무에서는:
- HotSpot JVM
- Tiered Compilation
- C1/C2 Compiler
- Escape Analysis
- Warm-up
을 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
인터프리터 vs JIT Compiler
를 Python/JavaScript 비교와 함께 JVM 실행 전략 관점으로 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java Escape Analysis 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java 인터프리터(Interpreter) vs JIT Compiler 완벽 이해하기 (0) | 2026.05.26 |
| Java OutOfMemoryError(OOM) 원인 분석 완벽 이해하기 (0) | 2026.05.26 |
| Java GC 종류와 특징(G1GC, ZGC 등) 완벽 이해하기 (0) | 2026.05.26 |
| Java Garbage Collector(GC) 원리 완벽 이해하기 (0) | 2026.05.26 |
댓글