본문 바로가기
Java/basic

JIT 컴파일러 동작과정

by Ellery 2022. 10. 30.

https://www.geeksforgeeks.org/just-in-time-compiler/

자바코드를 자바 컴파일러가 컴파일하면 바이트코드(컴파일된 자바코드. JVM이 읽을 수 있는 코드)가 되는데 이를 실행하는 과정에서 인터프리터와 JIT 컴파일러를 실행하는 쓰레드가 같이 돌면서 바이너리 코드(OS들이 읽을 수 있는 바이너리코드)로 변환하게 된다.
(바이트코드 실행시 interpreter와 JIT 컴파일러가 동시에 돌아감)

JVM 내부의 실행엔진에 있는 인터프리터는 바이트코드 명령어를 하나씩 읽어서 해석하고 실행하는데, 하나하나 해석하면서 실행하기 때문에 느릴 수 있다.

JIT 컴파일러는 native code 중에 반복되어 사용되는 코드나 기계어로 변환 시에 많은 리소스가 필요한 부분을 실시간으로 변환해서 기계어로 캐싱해두는 방식으로 최적화를 하기 때문에 인터프리터보다 실행 성능이 좋을 수 있다. (100% 성능이 좋다는 것이 아니기 때문에 '좋을수 있다' 라고 표현함). JIT 컴파일러를 사용한ㄴ JVM은 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넘을 때만 컴파일을 한다. 이 때 캐싱된 기계어를 통해 인터프리터의 해석 과정 없이 기계어로 바로 실행이 가능하게 된다.

실행 엔진이 어떻게 동작하는 지는 JVM 명세에 규정되어있지 않아서 벤더마다 다양한 기법으로 최적화를 하고 있다. 벤더별 차이점은 나중에 필요하다면 찾아서 공부해보자.

HotSpot vs Open J9
JDK 벤더 선택시 고려사항들

- 백기선님의 자바 온라인 스터디 https://github.com/whiteship/live-study 주제를 정리한 내용입니다.

참고
- https://www.geeksforgeeks.org/just-in-time-compiler/
- https://d2.naver.com/helloworld/1230
- https://stackoverflow.com/questions/16568253/difference-between-jvm-and-hotspot