JIT 컴파일러

JIT (Just-In-Time) 컴파일러는 런타임 시 바이트 코드를 원시 시스템 코드로 컴파일하여 Java™ 애플리케이션의 성능을 향상시키는 런타임 환경의 컴포넌트입니다.

Java 프로그램은 여러 다른 컴퓨터 아키텍처에서 JVM이 해석할 수 있는 플랫폼 중립 바이트 코드를 포함하는 클래스로 구성됩니다. 런타임 시 JVM은 클래스 파일을 로드하고 각 개별 바이트 코드의 시맨틱을 판별하며 해당 계산을 수행합니다. 해석 중 추가 프로세서 및 메모리 사용은 Java 애플리케이션이 원시 애플리케이션보다 느리게 수행됨을 의미합니다. JIT 컴파일러는 런타임 시 바이트 코드를 원시 시스템 코드로 컴파일하여 Java 프로그램의 성능을 향상시키는 데 도움을 줍니다.

기본적으로 JIT 컴파일러는 사용으로 설정됩니다. 메소드가 컴파일되면 JVM이 해당 메소드의 컴파일된 코드를 해석하지 않고 바로 호출합니다. 이론적으로 컴파일에 프로세서 시간 및 메모리 사용이 필요하지 않은 경우 모든 메소드를 컴파일하면 Java 프로그램의 속도가 원시 애플리케이션의 속도와 일치할 수 있습니다.

JIT 컴파일에는 프로세서 시간 및 메모리 사용이 필요합니다. JVM이 처음 시작될 때 수천 개의 메소드가 호출됩니다. 이러한 메소드를 모두 컴파일하면 프로그램이 결국 매우 우수한 최대 성능에 도달하는 경우에도 시작 시간에 크게 영향을 줄 수 있습니다.

실제로 메소드가 처음 호출될 때 컴파일되지 않습니다. JVM은 각 메소드에 대해 사전 정의된 컴파일 임계값에서 시작되고 해당 메소드가 호출될 때마다 감소되는 호출 개수를 유지보수합니다. 호출 개수가 0에 도달하면 해당 메소드에 대한 JIT(Just-In-Time) 컴파일이 트리거됩니다. 따라서 자주 사용되는 메소드는 JVM이 시작된 직후 컴파일되며 자주 사용되지 않는 메소드는 훨씬 나중에 컴파일되거나 전혀 컴파일되지 않습니다. JIT 컴파일 임계값은 JVM을 빠르게 시작하고 JVM의 성능을 향상시키는 데 도움이 됩니다. 임계값은 시작 시간과 장기 성능 사이의 최적의 밸런스를 얻을 수 있도록 선택되었습니다.

JIT 컴파일러는 다른 최적화 레벨 ( cold, warm, hot, veryHot또는 scorching ) 에서 메소드를 컴파일할 수 있습니다 ( -Xjitoptlevel 참조). 최적화 레벨이 높을수록 더 나은 성능을 제공할 것으로 예상되지만 CPU 및 메모리 측면에서는 컴파일 비용이 더 높아집니다. 메소드에 대한 초기 또는 기본 최적화 레벨은 warm이지만 경우에 따라 JIT 휴리스틱에 따라 시작 시간을 개선하기 위해 최적화 레벨이 cold로 다운그레이드됩니다.

여러 메커니즘을 통해 메소드를 더 높은 최적화 레벨로 다시 컴파일할 수 있습니다. 이러한 메커니즘 중 하나는 샘플링입니다. JIT 컴파일러는 주기적으로 작동하는 전용 샘플링 스레드를 유지보수하고 스택의 맨 위에 더 자주 표시되는 Java 메소드를 판별합니다. 이러한 메소드는 성능에 있어서 더 중요한 것으로 간주되며 상위 레벨(hot, veryHot 또는 scorching)에서 다시 최적화될 후보입니다.

JIT 컴파일러를 사용 불가능하게 할 수 있으며, 이 경우 전체 Java 프로그램이 해석됩니다. JIT 컴파일 문제점을 진단하거나 일시적으로 해결하기 위한 경우를 제외하고 JIT 컴파일러를 사용 안함으로 설정하는 것은 권장되지 않습니다.