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