JIT vs AOT Compilation

ㅊㄷㅁ·2023년 7월 25일
0

StepByStepCS

목록 보기
1/2

JIT(Just In Time)

image

  • JIT 란?

    JIT 컴파일은 소스코드를 즉시 기계어로 변환하는 것이 아닌, 중간 단계의 중간 언어(Intermediate Language 또는 IL)로 컴파일 후, 실행 시점 단계에서 실제 기계어로 컴파일 하는 방식이다.

    • 대표적인 JIT 컴파일을 사용하는 언어는 Java, C# 등을 예로 들 수 있다.


Strenght / Weekness

  1. Strenght
  • 플랫폼 독립성 : JIT 컴파일은 바이트 코드를 실행하는 시점에 해당 플랫폼에 맞는 기계어로 변환하여 실행
  • 최적화 : JIT 컴파일은 런타임에 최적화를 수행
  • 메모리 사용량 : JIT 컴파일은 런타임에 필요한 코드만을 메모리에 올
  • 업데이트와 배포의 용이성 : . 변경된 바이트 코드만 업데이트
  1. Weekness
  • 성능 부하
  • 메모리 사용량 : JIT 컴파일은 실행 중에 기계어 코드를 메모리에 저장해야 하므로 메모리 사용량이 더 많아질 수 있
  • 보안 이슈
  • 코드 크기 : JIT 컴파일은 런타임에 바이트 코드를 기계어로 변환하므로, 프로그램 실행 파일의 크기가 커질 수 있다


JAVA의 JIT 과정(JVM)

1. 솔루션 빌드 단계

  • Java 소스코드(.java)를 컴파일러(Javac)을 사용해 바이트 코드(.Class)로 변환
  • 해당 바이트 코드가 JIT 방식의 중간 언어(IL).
  • 이 바이트 코드는 특정 OS에 종속되지 않음

2. JVM 시작 및 클래스 로딩

  • 자바 프로그램이 실행되면서 JVM(Java Virtual Machine)이 같이 실행
  • JVM은 실행 할 수 있는 IL 즉, 바이트 코드(.Class)를 찾고 필요한 클래스를 로딩하며 이 과정을 '클래스 로딩'이라고 일컫는다.
  • 로딩된 클래스를 클래스 로더가 JVM 메모리에 올려 놓는다.

3. JVM 시작 및 클래스 로딩

  • JVM은 클래스 로더를 통해 읽어온 바이트 코드(.Class)를 해석하여 JVM의 런타임 데이터 영역에 올려 Runtime StackHeap 영영 메모리로 할당.

4. JIT 컴파일과 최적화

  • JVM은 Interpreter:인터프리터 방식으로 바이트 코드(.Class)를 한줄씩 해석하며 프로그램을 실행
  • 인터프리터 방식으로 진행되면 실행 시간이 느리기 때문에, JVM은 모니터링을 통해 반복적인 일부 코드를 JIT컴파일러를 통해 기계어로 변환해 최적화를 진행
  • 최적화된 기계어 코드를 CPU에서 직접 실행해 실행 속도를 향상.

5. 가비지 컬렉션(Garbage Collection)

  • 더 이상 참조되지 않는 객체들을 자동으로 탐지하여 메모리에서 해제.

6. 프로그램 종료

  • 자바 프로그램이 모든 작업을 마치면 JVM은 실행을 종료



AOT(Ahead of Time)

image

  • AOT 란?

    소스 코드를 기계어로 변환하는 과정이 미리(Compile Time) 실행되는 방식, 프로그램을 실행하기 전 미리 컴파일하여 기계어 코드로 변환 후 이를 실행 할 때는 이미 기계어로 된 코드를 직접 사용.

    • 대표적인 AOT 컴파일을 사용하는 언어는 C, C++ 등을 예로 들 수 있다.

Strenght / Weekness

  1. Strenght
  • 성능 및 실행 속도 : 이미 기계어로 된 코드를 명령형태로 실행
  • 특정 플랫폼 최적화
  • 보안 및 배포 : 기계어 코드를 포함하기 때문에 해석의 어려움
  • 메모리 사용량 : 메모리에 바이트 코드를 로딩할 필요가 없음
  1. Weekness
  • 특정 플랫폼 최적화
  • 메모리 사용량 : 메모리에 바이트 코드를 로딩할 필요가 없지만 JIT에 비해 가비지 컬렉터, 최적화가 힘들기 때문에 최적화 되지 않으면 메모리를 사용량 증가
  • 런타임 최적화 한계
  • 빌드 시간의 증가 : 기계어 코드를 생성하기 때문에 빌드시간 증가



결론

JIT

JIT는 프로그램의 소스 코드를 IL 즉, 바이트 코드로 변환시켜 특정 OS에 종속되지 않고, 프로그램 실행 시 인터프리터 방식과 JIT 방식의 최적화를 통해 가벼운 메모리 사용량 보여준다.

AOT

AOT 컴파일 과정은 프로그램의 소스 코드를 실행하는 것이 아니라, 이미 기계어로 된 명령어를 실행하는 방식으로 동작하며, 이를 통해 높은 실행 속도와 최적화된 성능을 제공

profile
ㅊㄷㅁ

2개의 댓글

comment-user-thumbnail
2023년 7월 25일

좋은 글 감사합니다. 자주 올게요 :)

1개의 답글