Skip to content

Latest commit

 

History

History
37 lines (12 loc) · 2.61 KB

[#4] JIT 컴파일러란 무엇인가요.md

File metadata and controls

37 lines (12 loc) · 2.61 KB

JIT 컴파일러란 무엇인가요?

Java에서 소스코드는 javac 컴파일러에 의해 바이트 코드로 변환되며 JVM은 바이트 코드를 실행하므로써 자바코드로 작성된 애플리케이션이 동작을 수행하게 됩니다.

이 때 바이트 코드는 인터프리터에 의해 기계어 코드로 변환되어 실행되는데 JIT 컴파일러는 빈번하게 혹은 반복적으로 사용되는 코드들에 대해서 매번 인터프리터에 의해 기계어로 변환되지 않고 바로 사용할 수 있도록 기계어 코드로 변환하여 코드의 수행시간에 최적화를 제공합니다.


JIT 컴파일러는 어떠한 기준을 통해 최적화할 코드를 선정하나요?

각 메서드는 Invocation 카운터와 Back Edge 카운터를 가지고 있으며 JIT 컴파일러는 이를 통해 어떤 코드를 최적화 할지 결정합니다.

Invocation 카운터의 경우 메서드를 시작할 때마다 카운터 값이 하나씩 증가하며 XX:CompileThreshold JVM 옵션에 설정된 값만큼 메서드가 호출되었을 때 인터프리터에 의해 JIT 컴파일러로 컴파일을 요청하게 됩니다.

Back Edge 카운터의 경우 높은 바이트 코드 인덱스에서 낮은 바이트 코드 인덱스로 흐름이 변경 될 때마다 증가하게 되는데 즉 반복문을 수행할 때마다 카운터 값이 하나씩 증가하게 됩니다. Back Edge 카운터는 XX:CompileThresholdXX:OnStackReplacePercentage 라는 두 가지 JVM 옵션의 설정 값을 통해 컴파일 대상을 설정하는데 이는 CompileThreshold * OnStackReplacePercentage / 100 으로 구할 수 있습니다. 해당 값 만큼 반복문을 수행하였을 때 인터프리터에 의해 JIT 컴파일러로 컴파일을 요청하게 됩니다.


JIT 컴파일러의 종류 중에서 C1, C2 컴파일러에 대해 설명해주실 수 있나요?

C1과 C2 컴파일러는 각각을 클라이언트와 서버 컴파일러라고 부르기도 하며 클라이언트 컴파일러는 주로 GUI 애플리케이션 및 기타 클라이언트 프로그램에 C2 컴파일러는 주로 실행시간이 긴 서버 애플리케이션에 사용되었지만 현대의 자바 애플리케이션에서는 이를 뚜렷하게 구분하지 않고 최대한 성능 최적화를 고려하여 컴파일러를 선택합니다.

C1 컴파일러는 C2 컴파일러보다 컴파일 시간도 더 짧고 단순하게 설계되었습니다.C2 컴파일러에서는 컴파일 시간이 C1 컴파일 시간보다 상대적으로 길지만 더 높은 수준의 최적화를 지원합니다.