JAVA · 성능/JVM
JIT 최적화와 이스케이프 분석
JIT 컴파일러의 최적화 기법과 이스케이프 분석을 이해합니다.
성능/JVM고급JIT이스케이프분석인라이닝최적화
핵심 설명
JIT 컴파일러의 최적화 기법과 이스케이프 분석을 이해합니다.
Java code
// JIT 최적화 확인 옵션
// -XX:+PrintCompilation — 컴파일 로그
// -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining — 인라인 로그
public class JITOptimization {
// 1. 인라이닝 — 작은 메서드 호출을 제거
static int add(int a, int b) { return a + b; }
// 2. 이스케이프 분석 — 힙 할당을 스택으로
static long sumPoints() {
long sum = 0;
for (int i = 0; i < 1_000_000; i++) {
// JIT가 Point가 메서드 밖으로 나가지 않음을 감지
// -> 힙 대신 스택에 할당 (스칼라 치환)
var p = new int[]{i, i * 2}; // 이스케이프하지 않음
sum += p[0] + p[1];
}
return sum;
}
// 3. 루프 최적화 — 언롤링, 벡터화
static int arraySum(int[] arr) {
int sum = 0;
for (int v : arr) sum += v; // JIT가 SIMD 벡터화 가능
return sum;
}
// 4. 데드 코드 제거
static void deadCode() {
int result = 0;
for (int i = 0; i < 1000; i++) {
result += i; // result를 사용하지 않으면 전체 루프 제거
}
// JIT가 결과가 사용되지 않음을 감지 -> 루프 제거
}
public static void main(String[] args) {
// 워밍업 — JIT 컴파일 유도
for (int i = 0; i < 10_000; i++) {
sumPoints();
}
System.out.println("JIT 최적화 완료");
System.out.println("합계: " + sumPoints());
}
}학습 팁
이스케이프 분석은 객체가 메서드 밖으로 나가지 않으면 힙 할당을 생략합니다. 짧은 수명의 객체 생성을 두려워하지 마세요.
주의할 점
벤치마크에서 결과를 사용하지 않으면 JIT가 코드를 제거합니다. JMH의 Blackhole로 이를 방지해야 합니다.
자주 묻는 질문
JIT 최적화와 이스케이프 분석란 무엇인가요?
JIT 컴파일러의 최적화 기법과 이스케이프 분석을 이해합니다.
JIT 최적화와 이스케이프 분석 학습 시 주의할 점은 무엇인가요?
벤치마크에서 결과를 사용하지 않으면 JIT가 코드를 제거합니다. JMH의 Blackhole 로 이를 방지해야 합니다.