백엔드 개발자 블로그

JIT Compiler 본문

Java

JIT Compiler

backend-dev 2024. 4. 29. 20:56

JIT Compiler란?

  • JVM 내에 구성된 execution engine을 통해서 바이트 코드를 기계어로 변환하여 애플리케이션을 실행시킨다
  • 바이트 코드를 기계어로 실행시키는 과정을 인터프리터 라고 한다
  • jit compiler는 인터프리터 과정에서 Java 프로그램의 성능을 향상시키는 데 도움을 준다

💡 그럼 바이트 코드는 어디서 생성되지?

사전에 구현한 소스 코드(.java)를 javac로 컴파일하여 소스 코드(.class)로 변환한다 컴파일된 결과물은 보통 jar, war 형식의 압축 파일로 생성된다


컴파일은 왜 필요하지?

  • 컴파일하면 OS와 상관없이 JVM만 설치되어 있으면 어느곳에서도 애플리케이션을 동작시킬수 있다
  • 대표적인 컴파일 언어는 C, C++ 이다

인터프리터 과정이 필요한가?

  • 컴파일된 소스 코드를 런타임에 실행시 한번에 많은 소스 코드를 실행시키는 과정이 느리다는 단점이 있다.
  • 실행시간을 개선하기 위해 인터프리터 과정이 필요하다. 그래서 자바는 컴파일과 인터프리터를 혼합하여 OS에 독립적이고 실행을 빠르게 했다.

💡 인터프리터는 구체적으로 어떻게 동작하지?

  • 인터프리터 과정은 실시간으로 바이트 코드를 라인별로 읽어서 수행되므로, 컴파일로 수행하는 것보단 빠를수 있겠지만 런타임시 코드 라인을 읽어서 수행하다보니 속도가 많이 빠르지는 않다.
  • 대표적인 인터프리터 언어는 Python, javascript 등이 있다

자바에서 인터프리터 과정은 어떻게 동작하나?

  • JVM > execution engine > JIT compiler > C1 Compiler, C2 Compiler가 존재한다
    • C1 컴파일러는 컴파일만 수행
    • C2 컴파일러는 컴파일 + 캐싱 => 실행 시간 단축
      • 모든 코드를 C2 단계에서 캐싱하지는 않는다
      • 캐싱되는 크기는 제한이 있어서 캐싱되어 저장되었더라도 몇몇 코드는 다시 제거되기도 한다

참고

'Java' 카테고리의 다른 글

STATIC  (1) 2024.05.02
Enum  (0) 2024.04.29
G1 GC vs ZGC  (0) 2024.04.29
heap dump 분석하기 (feat. OOM)  (0) 2024.04.29
병렬처리를 이용한 이미지 리사이즈 개선  (0) 2024.04.29