JIT과 AOT
0. 개요
Spring Boot 3.0의 변경점을 알아보던 도중, Spring Native를 공식적으로 지원한다는 것을 알게 되었습니다.
Spring Native가 뭔지 몰랐던 저는 공부하게 되었고, 그 내용을 공유하고자 합니다.
우선, Chat GPT에 Spring Native에 대해 물어 보니 아래와 같은 답변을 받았습니다.
요즘 핫한 마이크로서비스(MSA)에 유용하다고 하니 공부를 안할 이유가 없었습니다.
위 내용중 AOT(Ahead-Of-Time) 컴파일러가 네이티브 이미지 생성을하고, 이 것을 통해 초기 실행 속도 향상, 메모리 최적화, 더 적은 종속성을 만들 수 있다고 하니 이 AOT에 대해 궁금해졌습니다.
AOT 컴파일러는 JIT 컴파일러와 비교하여 설명할 것이기 때문에 우선 JIT 컴파일러를 가볍게 훑어보고 지나가겠습니다.
1. JIT?
자바 프로그램의 생성 및 실행 순서 그림으로 표현하면 아래와 같습니다.
.java 파일을 Java Compiler가 컴파일 하여 .class 파일로 변환시킵니다.
해당 .class 파일을 JVM이 인터프리팅 하여 실행합니다.
그림에서 확인할 수 있듯이 JVM 내부에는 JIT 컴파일러가 있습다.
💡 Java Compiler와 JIT 컴파일러는 다릅니다.
초기 JVM에는 JIT 컴파일러가 없었습니다.
JIT 컴파일러가 만들어진 이유 중 하나가 프로그램을 효율적으로 실행하기 위해서입니다.
기존 인터프리터만의 방식은 실행 속도가 느려,
JIT 컴파일러가 러닝 타임중에 프로그램을 최적화 합니다.
JIT 컴파일러가 하는 일
결국, 위의 구조들로 JAVA는 플랫폼에 독립적이면서 효율적인 프로그램을 만들 수 있습니다.
2. AOT가 그래서 뭔데?
JAVA Compiler를 거치게 되면 .class 파일이 생기고, 해당 파일은 Byte Code형식 입니다.
AOT는 .class 파일을 Native Binary로 다시 컴파일해서 실행합니다.
즉, 기존의 JVM처럼 인터브리터 방식을 사용하지 않고, 컴파일 방식을 사용합니다.
이 AOT를 내장해서 컴파일을 실행하는 것이 GraalVm인 것입니다.
기존 구조와 동일하고 VM만 다른 것입니다.
하지만, AOT를 사용하게 되면 플랫폼에 종속적이게 됩니다.
AOT와 기존의 JVM를 비교하면 아래 그림과 같습니다.
https://www.cesarsotovalero.net/blog/aot-vs-jit-compilation-in-java.html
JIT과 AOT의 차이점을 표로 나타내면 아래와 같습니다.
JIT | AOT | |
컴파일 시점 | 런타임 | 실행 전 |
최적화 시기 | 런타임 | 실행 전 |
메모리 | 런타임에 추가로 JIT이 동작되므로 오버헤드 발생 | 미리 네이티브 코드로 바꾸기 때문에 효율적 |
실행 방법 | 인터프리팅 | 컴파일링 |
JIT과 AOT는 위의 표와 같은 차이점이 존재합니다.
AOT의 경우 인터프리팅이 아닌 컴파일링으로 동작해서 운영체제에 종속적이게 되지만,
AOT로 만들어진 네이티브 이미지를 컨테이너에 포함시킬 수 있어, 더 적은 메모리와 실행 속도로 애플리케이션을 동작시킬 수 있습니다.
때문에, MSA에서 AOT 컴파일 방식이 기존의 방식보다 이점이 있습니다.
💡 GraalVm은 AOT와 JIT 방식 모두 지원합니다. 설정에 따라서 마음껏 변경할 수 있습니다.