JIT(Just-In-Time) 컴파일러

JIT 는 동적변환으로, 프로그램 실행을 보다 빠르게 하기 위해서 만들어졌다.

-> 명칭은 컴파일러지만, 실행시에 적용되는 기술이다.

자바에서 기계어를 실행하는 방식

인터프리터 방식

  • 바이트코드를 명령어 단위로 해석하고 실행한다. (간편하지만 성능이 느릴 수 밖에 없다)

JIT 컴파일러 방식

  • 기본 개념

    • JIT 컴파일러는 애플리케이션이 실행될 때 바이트코드를 네이티브 코드로 변환하여 실행 속도를 높인다.

    • JIT 컴파일러는 런타임에 코드 최적화를 수행하여 성능을 개선한다.

  • 동작 방식

    • JVM 은 처음에 바이트코드를 인터프리터로 실행하고 자주 실행되는 코드에 대해 JIT 컴파일러가 네이티브 코드를 생성한다.

    • 이후에는 JIT 컴파일러가 생성한 네이티브 코드를 직접 실행하여 성능을 향상시킨다.

C1, C2 컴파일러를 통한 JIT 컴파일러 최적화

  • Java 의 JIT 컴파일러는 두 가지 주요 컴파일러로 구성되어 있다.

  • C1(client) 컴파일러, C2(server) 컴파일러 이들은 HotSpot JVM 에서 중요한 역할을 하여, 각각 서로 다른 최적화 전략을 사용하여 코드 성능을 개선한다.

  • 둘다 JIT 컴파일러로서, 바이트코드를 실행 중에 네이티브 코드로 변환하는 일을 하지만, 목적과 최적화 수준이 다르다.

C1 컴파일러

  • C1 컴파일러는 상대적으로 빠른 컴파일을 목표로 하며, 경량 최적화를 사용한다. -> 즉, 바이트코드를 빠르게 컴파일하지만, 실행 시 최적화 수준은 낮다.

  • 애플리케이션의 빠른 시작 시간을 보장하는 것이 주요 목표이다. 서버보다는 클라이언트 애플리케이션에서 빠른 응답성을 위해 사용된다.

C2 컴파일러

  • C2 컴파일러는 실행 시 높은 성능을 위해, 더 높은 최적화를 목표로 한다. -> 즉, 애플리케이션 실행 성능을 극대화하기 위해 CPU 와 메모리를 더 많이 사용한다.

  • 서버 애플리케이션의 지속적인 고성능을 목표로 한다. 초기 시작 시간은 조금 느릴 수 있지만, 장기적으로는 성능이 크게 향상된다.

C1, C2 컴파일러를 사용한 최적화 동작

  • 처음에는 C1 컴파일러가 빠르게 컴파일하여 애플리케이션을 빠르게 시작되게 하고, 이후 더 자주 실행되는 메서드에 대해서는 C2 컴파일러가 성능 최적화를 적용한다.

  • 이를 통해서 클라이언트와 서버 애플리케이션 모두에서 빠른 시작 시간과 높은 성능을 동시에 얻을 수 있다.

Last updated