[Java] JIT 컴파일러란?

devdo·2022년 1월 5일
0

Java

목록 보기
5/56
post-thumbnail

JIT 컴파일러의 정체


이미지 출처: http://tcpschool.com/java/java_intro_programming

인터프리터는 바이트 코드를 한줄한줄 읽으면서 OS가 실행할 수 있도록 기계어로 번역을 하는 것이다. 초기 JVM은 인터프리터방식만 이용하여 한줄 한줄 읽기 때문에 실행속도가 느린 단점이 있었지만 JIT 컴파일러 방식을 도입해 속도를 보완했다.

JIT라는 것Just-In-Time의 약자이다. JIT를 사용하는 언어에는 자바와 .NET 등이 있다. 즉, 자바에서만 사용하는 개념은 아니다.

JIT를 좀 더 풀어보면, 동적 변환(Dynamic translation)이라고 보면 된다.
이러한 JIT라는 것을 만든 이유는 프로그램 실행을 보다 빠르게 하기 위해서다. 명칭이 컴파일러지만 실행시에 적용되는 기술이다.

역사적으로 보면, 컴퓨터 프로그램을 실행하는 방식은 두가지로 나뉜다.

1) 인터프리터 방식
2) static 컴파일 방식
=> JIT 컴파일러

인터프리터 방식은 프로그램을 실행할 때마다 컴퓨터가 알아들을 수 있는 언어로 한줄씩 한줄씩 변환하는 작업을 말한다. 따라서 간편하기는 하지만 성능이 매우 느리다.

정적 컴파일 방식실행하기 전에 미리 기계어로 변환하는 작업을 말한다. 따라서 변환작업은 딱 한번만 수행된다.

JIT는 static 컴파일 방식 으로 되있는 것이다.

그래서 JIT의 변환작업은 지속적으로 인터프리터가 하다가, 인터프리터가 자주 사용하는 코드의 정보를 캐시에 담아두었다가 미리 꺼내서 바로 실행하는 것이다.


그럼 Javac는?

그런데, 지금까지 설명한 내용만 보면 의아해할 수 있다.
javac 컴파일러는 뭔가 그럼?

javac 컴파일러가 하는 일은 java파일을 class파일(바이트코드)로 변환하는 것일 뿐이다.

JAVA의 모토 중 하나가 Complice once, Run anywhere이다.

한번 컴파일한 이 바이트 코드로 모든 OS에 사용할 수 있게 한 것이다.


아래 그림을 통해 쉽게 이해할 수 있다.


이미지 출처 : https://images.app.goo.gl/LsXuRMLSYmfSDWzQ9

즉, 기본적으로 보면,
javac 컴파일러는 어떤 OS에서도 수행할수 있도록 바이트 코드라는 파일로 만들고, 컴퓨터가 제대로 이해하기 위한 언어(기계어)로 다시 변환작업을 하는 데 이역할을 JVM안의 JIT 컴파일러가 하는 것이다.


정리

  • JIT 컴파일러는 바이트코드를 nativecode(기계어)로 바꾸기 때문에 실행이 빠르지만 nativecode(기계어)로 변환하는데 비용이 발생한다.

  • 이런 변환 비용 때문에 jvm은 모든 코드를 JIT Compiler방식으로 실행하지 않고 인터프리터 방식을 사용하다 자주 사용되는 코드만 캐싱을 하는 것이다.

  • JVM은 내부적으로 어떤 메서드가 얼마나 자주 수행되는지를 확인하고 HotSpot이라고 판단하면 컴파일을 수행해놓는다.


출처

profile
배운 것을 기록합니다.

0개의 댓글