[Java] Jit Compiler 에 대한 이야기
http://blog.takipi.com/java-on-steroids-5-super-useful-jit-optimization-techniques/
-
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 을 사용하는 것이 좋을 수 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] earphone(headset) plug or unplug intent action (0) | 2018.01.22 |
---|---|
[android] Build 할 때 MissingTranslation 관련 에러가 난다면.. (0) | 2018.01.21 |
[android] Firebase JobDispatcher 문제.. (Job 미실행) (0) | 2017.12.05 |
안드로이드 O 암시적 브로드케스트 예외 ( Implicit Broadcast Exceptions ) (0) | 2017.10.21 |
Android O Background 실행 제한 (1) | 2017.10.20 |
댓글