CS

JIT(Just-In-Time) 컴파일러

baek-dev 2025. 3. 5. 18:47

⚡ 1. JIT(Just-In-Time) 컴파일러란?

JIT(Just-In-Time) 컴파일러프로그램 실행 중(런타임)에 바이트코드를 네이티브 코드(기계어)로 변환하는 컴파일러입니다.

JIT 컴파일러는 Java, C#, Kotlin 등의 언어에서 사용되며, 인터프리터 방식과 정적 컴파일 방식의 장점을 결합한 기술입니다.

 

💡 쉽게 말하면:

일반적으로 컴파일은 실행 전에 이루어지지만, JIT 컴파일러는 실행 중에 컴파일을 수행

바이트코드(Bytecode)를 네이티브 코드(Native Code)로 변환하여 속도를 향상시킴

Java Virtual Machine(JVM).NET CLR(Common Language Runtime) 에서 사용됨

JIT 컴파일러 = 실행 중(Just-In-Time)에 코드를 변환하여 성능을 최적화하는 컴파일러

 

⚡ 2. JIT 컴파일러의 동작 방식

JIT 컴파일러는 인터프리터 방식과 정적 컴파일 방식의 장점을 결합하여 동작합니다.

 

🏗 JIT 컴파일러의 기본 동작

 

1️⃣ 프로그램 실행 시 JVM이 바이트코드를 인터프리터 방식으로 실행

2️⃣ JIT 컴파일러가 자주 실행되는 코드를 감지하여 네이티브 코드로 변환

3️⃣ 변환된 네이티브 코드를 캐싱하여 재사용 → 실행 속도 최적화

1. Java/Kotlin 코드 → 2. 바이트코드 변환 → 3. 실행 중 JIT이 최적화 → 4. 네이티브 코드 실행

 

✅ JIT 컴파일러 vs AOT 컴파일러

비교 항목 JIT 컴파일러 (Just-In-Time) AOT 컴파일러 (Ahead-Of-Time)
실행 시점 프로그램 실행 중 (런타임) 프로그램 실행 전 (빌드 시)
최적화 방식 실행 중 최적화 & 캐싱 미리 최적화 & 네이티브 변환
속도 첫 실행은 느림, 이후 빨라짐 실행 속도 빠름
플랫폼 독립성 JVM을 통한 플랫폼 독립성 제공 플랫폼에 맞는 바이너리 생성
예제 Java (JVM HotSpot JIT), C# (.NET CLR JIT) C, C++ (GCC, Clang)

📌 즉, JIT은 실행 중 최적화하며, AOT는 미리 컴파일하여 속도를 높임!

 

⚡ 3. JIT 컴파일러의 장점 & 단점

✅ JIT 컴파일러의 장점

 

1️⃣ 실행 중 최적화 (Adaptive Optimization)

자주 실행되는 코드를 분석하여 런타임 중 최적화 가능

캐싱된 네이티브 코드를 사용하여 반복 실행 시 속도가 향상됨

 

2️⃣ 플랫폼 독립성 유지

바이트코드로 배포되므로 JVM이 설치된 모든 환경에서 실행 가능

한 번 컴파일한 코드를 여러 플랫폼에서 실행 가능

 

3️⃣ 동적 메모리 최적화

JIT은 가비지 컬렉션(GC)과 함께 최적화하여 메모리 효율을 향상

 

✅ JIT 컴파일러의 단점

 

1️⃣ 초기 실행 속도 느림

실행 중 컴파일이 이루어지므로, 초기 실행 속도가 느려질 수 있음

AOT(Ahead-Of-Time) 방식보다 첫 실행은 느림

 

2️⃣ 추가적인 메모리 사용

실행 중 네이티브 코드 변환을 저장하므로 추가적인 메모리 사용

메모리 제한이 있는 환경에서는 불리할 수 있음

 

3️⃣ 모든 코드가 최적화되지 않음

JIT이 분석하여 “자주 실행되는 코드만” 최적화

한번만 실행되는 코드는 JIT 최적화가 적용되지 않을 수 있음

 

⚡ 4. Java에서 JIT 컴파일러 동작 예제

✅ JIT이 없는 경우 (인터프리터 방식)

public class WithoutJIT {
    public static void main(String[] args) {
        for (int i = 0; i < 1_000_000; i++) {
            Math.sqrt(i); // 반복 실행
        }
    }
}

🔹 모든 연산이 바이트코드로 해석되므로 실행 속도가 느림

 

✅ JIT이 최적화된 경우

public class WithJIT {
    public static void main(String[] args) {
        long start = System.nanoTime();
        
        for (int i = 0; i < 1_000_000; i++) {
            Math.sqrt(i); // 반복 실행
        }
        
        long end = System.nanoTime();
        System.out.println("실행 시간: " + (end - start) + " ns");
    }
}

🔹 JIT 컴파일러가 Math.sqrt(i)를 최적화하여 네이티브 코드로 변환 → 실행 속도 증가

 

⚡ 5. JVM의 JIT 컴파일러 (HotSpot)

✅ JVM에서 JIT 컴파일러의 역할

 

Java에서 JIT 컴파일러는 JVM(Java Virtual Machine) 내부에서 동작하며,

JIT이 최적화하는 주요 부분은 HotSpot 이라고 부릅니다.

 

🏗 JVM 내부의 JIT 컴파일러 구성

Java 코드 → 바이트코드 변환 → JIT 컴파일러 실행 → 네이티브 코드 실행

 

🔹 JVM의 두 가지 JIT 모드

1️⃣ C1(클라이언트 모드) → 빠른 실행 속도를 위한 기본 최적화

2️⃣ C2(서버 모드, HotSpot JIT) → 추가적인 분석을 통해 고급 최적화 수행

 

📌 C2(서버 모드 JIT) 사용 시, 실행 중 동적 분석을 통해 추가적인 성능 최적화 적용

 

⚡ 6. JIT 컴파일러 최적화 기법

JIT 컴파일러는 실행 중 코드를 최적화하여 성능을 향상시킵니다.

 

✅ JIT의 대표적인 최적화 기법

최적화 기법 설명
인라이닝(Inlining) 자주 호출되는 메서드를 직접 코드에 삽입하여 호출 비용 감소
루프 최적화(Loop Unrolling) 반복문을 풀어서 실행 횟수를 줄임
가상 메서드 제거(Virtual Method Elimination) 런타임에 특정 클래스의 메서드가 고정되면 직접 호출
동적 프로파일링(Dynamic Profiling) 프로그램 실행 중 가장 많이 실행되는 코드를 최적화

 

⚡ 7. JIT 컴파일러가 사용되는 언어

JIT 컴파일러는 여러 프로그래밍 언어에서 사용됩니다.

 

✅ JIT이 사용되는 대표적인 언어

언어 JIT 사용 여부 JIT 엔진
Java ✅ 사용 HotSpot JVM
C# (.NET) ✅ 사용 CLR JIT
Python(PyPy) ✅ 사용 PyPy JIT
Kotlin (JVM 기반) ✅ 사용 HotSpot JVM
JavaScript (V8) ✅ 사용 Google V8 JIT

 

⚡ 결론

JIT(Just-In-Time) 컴파일러는 프로그램 실행 중에 바이트코드를 네이티브 코드로 변환하는 컴파일러

JVM(Java), .NET(C#)에서 널리 사용되며, 실행 속도를 최적화함

인터프리터 방식보다 빠르고, AOT(정적 컴파일)보다 유연함

초기 실행은 느릴 수 있지만, 실행 중 최적화로 성능 향상 가능

 

🚀 JIT을 활용하면 프로그램 성능을 극대화할 수 있음!

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

SOLID 원칙  (0) 2025.04.04
DSL  (0) 2025.03.25
트러블 슈팅  (0) 2025.02.28
SSE (Server-Sent Events)  (0) 2025.02.19
락(Lock)과 동시성  (0) 2025.02.18