* JIT (Just-In-Time) Compiler

> 언제나 자바 메서드가 호출되면 Byte code를 Compile 하고 실행 가능한 Native Code 로 변환

> Server 와 Client 보전으로 나뉨

> App 에서 각각의 메서드를 Compile 할만큼 여유가 없음.
    따라서, 모든 코드는 초기에 인터프리터에 의해서 시작되고 해당 코드가 충분히 많이 사용될 경우 compile target 이 된다.


* JIT Compile Optimization
    > HotSpot VM 에서 이 작업은 각 메서드에 있는 counter 를 통해 통제되며, 메서드에는 2개의 Counter 가 존재한다

Invocation Counter

- 메서드를 실행할 때마다 증가

Backedge Counter

- 높은 bytecode index 에서 낮은 index 로 Control flow 가 변경될 때 마다 증가

- loop 가 존재하는지 확인할 때 사용되며 invocation counter 보다 compile priority 가 높다

> counter 들이 interpreter 에 의해서 증가될 때마다, Compile Threshold 에 도달했는지 확인하고 도달한 경우 interpreter 는 compile 을 요청

: Backedge Counter 의 Threadshold = Compile Threshold * OnStackReplacePercentage

- 값들은 JVM 실행 시 지정가능

-XX:Compile Threshold=35000

-XX:OnStackReplacePercentage=80

> Compile 이 요청되면 queue 에 쌓이고, 하나 이상의 Compiler Thread 가 모니터링 하다가 작업 가능한 경우 Compile 을 시작

> Interpreter는 Compile 중에도 메서드를 계속 수행하며, compile 이 완료되면 그 다음부터 메서드와 Compile 된 코드가 연결된다
    (기다리도록 하려면 -Xbatch 혹은 -XX:-BackgroundCompilation 옵션을 지정)


> OSR (OnStackReplace percentage)

: 인터프리터에 수행한 코드가 오랫동안 loop 가 지속되는 경우, compile 된 코드로 변경


> Inlining

: Called Method 가 simple 한 경우, caller mehtod 에 포함하여 Compile 하는 것을 의미

'SW > ::: Java' 카테고리의 다른 글

JVM (메모리 구조)  (0) 2020.10.10
//Garbage Collector  (0) 2020.10.10
Class Loading  (0) 2020.10.10
HotSpot VM  (0) 2020.10.10
Java GC 및 Memory 설정  (0) 2020.10.10

+ Recent posts