Java 2023. 1. 14. 19:39

JIT 컴파일

정의

  • Just-In-Time Compilation (= Dynamic Translation, 동적 번역)
  • 프로그램을 실행하는 시점(런타임)에 기계어로 번역하는 컴파일 기법이다.
    • 실행 시점에 인터프리트 방식으로 코드를 읽어가면서 기계어 코드를 생성한다.
    • 생성된 기계어 코드를 캐싱하여, 재사용 시에는 캐싱된 기계어 코드를 사용한다.

Java의 경우

  • Java 컴파일러 : 자바 프로그램 코드 → 바이트코드
  • JIT 컴파일러 : 바이트코드 → 기계어 코드

장점 (사용 이유)

  • Only 인터프리터 방식보다는 성능이 좋고, Only 정적 컴파일 방식보다는 이식성이 좋다.
  • 즉, 정적 컴파일러의 성능과 인터프리터 언어의 편의성을 모두 추구한다.

의외의 장점

정적 컴파일러로 번역한 결과보다 성능이 더 좋을 수 있다.

  • 실행 환경에 맞추어 최적화된 코드를 생성할 수 있다.
    • CPU 세대마다 지원하는 명령어가 다를 수 있는데, 더 효율적인 명령어로 수행 가능한 작업은 해당 명령어를 통해 수행하도록 할 수 있다. (ex. 인텔 x86 CPU의 MMX 명령어)
    • 실행 환경의 캐시, 메모리 크기 등 런타임에만 알 수 있는 H/W, S/W 정보를 활용할 수 있기 때문에 정적 컴파일보다 좋은 성능의 코드를 생성할 가능성이 있다.
  • 가상 함수 테이블을 통해 가상 메서드가 간접 호출될 때, 해당 메서드를 오버라이드하는 서브(자식) 클래스가 존재하지 않을 경우에 간접 호출을 정적 바인딩(Static Binding)으로 호출하거나 인라인으로 전개할 수 있다고 한다.

참고