본문 바로가기
programming/java

JIT(just-in-time) 컴파일

by 힐무새 2017. 12. 1.

java가 갖는 가장 큰 장점은 플랫폼에 독립적으로 동작할 수 있다는 점이다. 그렇다면 전체적인 java 프로그램의 실행 과정은 어떻게 진행될까?


  1. 프로그래머가 작성한 소스코드는 자바 컴파일러(javac.exe)에 의해 byte code로 변환된다. 이러한 byte code는 JVM 상에서 동작하기 때문에 플랫폼에 독립적으로 동작할 수 있다는 장점이 있기에 porting과 같은 것을 고려할 필요가 없다. 
  2. 변환된 byte code를 JVM이 실행한 플랫폼에 맞는 기계어로 변환한다. 다양한 플랫폼의 이식을 지원하기 위해 java가 지원하는 native methods을 통해 각 플랫폼에 맞는 기계어로 변환된다.

java는 JIT 컴파일을 수행한다. JIT 컴파일(just-in-time compilation)은 인터프리터와 컴파일이 혼합된 방식으로, 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 하지만 기존의 JIT 컴파일은 느리다는 단점이 존재한다. 컴파일러보다 인터프리터가 수행 속도가 느리다는 것은 자명하기 때문이다. 그럼에도 자바가 전통적인 컴파일 방식이 아닌 JIT 방식을 사용하는 이유는 byte code를 JVM에서 기계어로 바꾸는 과정은 플랫폼에 따라 다르게 적용되기 때문에 유연성 측면에서 인터프리터 방식을 적용한 것이 아닌가 생각된다.

따라서 jvm은 byte code를 인터프리터 방식으로 실행하되, 자주 사용되는 코드는 캐싱하여 사용한다. 전체 소스코드에서 실질적으로 성능을 좌우하는 것은 일부분이라는 가정에서 비롯된 것이다(이걸 hot-spot이라 부른다나 뭐라나). 자주 사용되는, 실행 시간을 좌우하는 중요한 코드는 기계어로 미리 정적 컴파일을 수행한 뒤, 그 코드가 수행되면 그저 컴파일된 기계어를 수행하면 된다. 나머지 덜 중요한 코드들은(성능에 비교적 중요하지 않은 코드) 인터프리터 방식으로 수행된다. 이렇게 되면 컴파일러의 단점인 목적프로그램 생성에 따른 메모리 낭비를 최소화함과 동시에 인터프리터가 갖는 수행시간의 단점을 어느정도 극복할 수 있다.

정리
  1. java는 컴파일러와 인터프리터의 혼합 방식인 JIT 컴파일을 수행한다.
  2. jvm은 성능을 좌우하는 중요한 코드는 컴파일하여 호출될 때마다 컴파일된 기계어를 실행하고, 그 외의 코드들은 실행 시점에서 기계어로 번역하여 사용한다.


'programming > java' 카테고리의 다른 글

[java]리플렉션(reflection)  (2) 2017.12.04
[java]JVM 구조  (1) 2017.12.02
[java] 정규 표현식  (0) 2017.06.01
[java] StringBuilder, StringBuffer의 차이  (0) 2017.06.01
[java]thread  (0) 2017.06.01