본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] Jit Compiler 에 대한 이야기

by 돼지왕 왕돼지 2018. 1. 14.
반응형

 [Java] Jit Compiler 에 대한 이야기


http://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/


Assembly, assembly jump, assembly level, Branch Prediction, byte code to assembly, bytecode, code jump, compiled mode, CPU, cpu register, deoptimize, function call, hotter, if 문, inline, inlining method, interpreted mode, Java, java compiler, javac, JIT, jit compiler, jit compiler 이야기, JIT 컴파일러, Jump, jump op, jvm reads bytecode, loop unrolling, mechanism, method inline, nedsted for, NPE, null check elimination, NullPointerException, optimization, register, thread fields, thread local storage, thread object, ThreadLocal, TLS, uncommon trap, [Java] Jit Compiler 에 대한 이야기, 우선순위, 최적화



-

bytecode 는 original Java 코드를 그대로(dynamic optimization 없이) 나타낸 것이라고 보면 된다.

JVM 이 bytecode 를 Assembly로 변환할 때 2가지 mode 가 작동한다.


1.Interpreted mode : JVM 이 bytecode 를 읽고 실행시킨다.

2. Compiled mode(byte code to assembly)


이 두가지 mode 를 잇는 것이 JIT compiler 이다.


Interpreted mode 가 assembly level 로 최적화할 때 필요한 정보들을 제공한다. ( 이때 CPU 가 많이 작용하겠징? )

충분한 running time 후에 JIT compiler 가 assembly level 로 optimization 한다.

이 optimization 은 기본적으로 assembly 의 jump op 를 방지하는 방향이 기본이다.



-

Optimize #1 : Null check elimination


null check 하는 코드가 존재하는데 실제로 불리지 않으면 Assembly 로 만들 때 null check 코드를 없앤다.

그리고 rare 하게 혹시라도 발생하면 NPE 를 발생하는 것이 아니라 deoptimize 를 해서 null check 있는 코드를 돌린다.

이를 “uncommon trap” mechanism 이라 부른다.



-

Optimize #2 : Branch Prediction


if 문에서 더 많이 타는 조건문(“hotter” 라 한다)을 우선순위를 높도록 assembly 코드로 만든다.

그래서 code jump 를 방지한다.



-

Optimize #3 : Loop Unrolling


for 문은 assembly jump 의 주적 중 하나이다.

그래서 jump 를 막기 위해 nested for 문이 있는 경우 이를 푸는 과정을 해준다.

사실 Java compiler 도 비슷한 것을 하지만, JIT 가 하는 것이 더 정확하고 효율이 좋을 수 있다.



-

Optimize #4 : Inlining Methods


function call 도 assembly jump 의 주적 중 하나이다.

inline 으로 처리해도 되겠다 싶은 부분은 inline 시켜버린다.



-

Optimize #5 : Thread fields and Thread Local Storage( TLS )


thread object 는 CPU register 에 저장이 되어, 그것의 field 들은 매우 빠르게 접근가능하다.

Thread local storage 를 사용하면 thread object 에 variable 을 저장하는 것을 말한다.

그래서 정말 조금이라도 성능향상이 되어야 하는 부분에서는 ThreadLocal 을 사용하는 것이 좋을 수 있다.


안드로이드 개발자라면 관련해서 읽어볼만한 글들


[android] ART 의 GC 이야기.

[Kotlin] Kotlin 은 Compile time 이 느리다는데.. 사실일까?




반응형

댓글