JIT 컴파일은 소스코드를 즉시 기계어로 변환하는 것이 아닌, 중간 단계의 중간 언어(Intermediate Language 또는 IL)로 컴파일 후, 실행 시점 단계에서 실제 기계어로 컴파일 하는 방식이다.
- 대표적인 JIT 컴파일을 사용하는 언어는 Java, C# 등을 예로 들 수 있다.
1. 솔루션 빌드 단계
- Java 소스코드(.java)를 컴파일러(Javac)을 사용해 바이트 코드(.Class)로 변환
- 해당 바이트 코드가 JIT 방식의 중간 언어(IL).
- 이 바이트 코드는 특정 OS에 종속되지 않음
2. JVM 시작 및 클래스 로딩
- 자바 프로그램이 실행되면서
JVM(Java Virtual Machine)
이 같이 실행- JVM은 실행 할 수 있는 IL 즉, 바이트 코드(.Class)를 찾고 필요한 클래스를 로딩하며 이 과정을 '클래스 로딩'이라고 일컫는다.
- 로딩된 클래스를
클래스 로더
가 JVM 메모리에 올려 놓는다.
3. JVM 시작 및 클래스 로딩
- JVM은 클래스 로더를 통해 읽어온 바이트 코드(.Class)를 해석하여 JVM의 런타임 데이터 영역에 올려
Runtime Stack
과Heap
영영 메모리로 할당.
4. JIT 컴파일과 최적화
- JVM은 Interpreter:인터프리터 방식으로 바이트 코드(.Class)를 한줄씩 해석하며 프로그램을 실행
- 인터프리터 방식으로 진행되면 실행 시간이 느리기 때문에, JVM은 모니터링을 통해 반복적인 일부 코드를 JIT컴파일러를 통해 기계어로 변환해 최적화를 진행
- 최적화된 기계어 코드를 CPU에서 직접 실행해 실행 속도를 향상.
5. 가비지 컬렉션(Garbage Collection)
- 더 이상 참조되지 않는 객체들을 자동으로 탐지하여 메모리에서 해제.
6. 프로그램 종료
- 자바 프로그램이 모든 작업을 마치면 JVM은 실행을 종료
소스 코드를 기계어로 변환하는 과정이 미리(Compile Time) 실행되는 방식, 프로그램을 실행하기 전 미리 컴파일하여 기계어 코드로 변환 후 이를 실행 할 때는 이미 기계어로 된 코드를 직접 사용.
- 대표적인 AOT 컴파일을 사용하는 언어는 C, C++ 등을 예로 들 수 있다.
JIT
JIT는 프로그램의 소스 코드를 IL 즉, 바이트 코드로 변환시켜 특정 OS에 종속되지 않고, 프로그램 실행 시 인터프리터 방식과 JIT 방식의 최적화를 통해 가벼운 메모리 사용량 보여준다.
AOT
AOT 컴파일 과정은 프로그램의 소스 코드를 실행하는 것이 아니라, 이미 기계어로 된 명령어를 실행하는 방식으로 동작하며, 이를 통해 높은 실행 속도와 최적화된 성능을 제공
좋은 글 감사합니다. 자주 올게요 :)