해당 포스트를 작성하는 목적
드디어 자바의신Vol2 에 진입했다. 자바의 역사와 JVM에 대해서 알아보는 단원인데, JVM에 관해서는 이미 앞서 진행했으므로, 크게 더 내용이 추가 될지는 모르겠다. 천천히 읽어보며, 미처 빠트린 내용이 있다면 이 포스트를 작성하며 다시 복습하고 가도록 하자.
JIT컴파일러는 무엇일까?
JIT 컴파일러는 바이트코드를 컴퓨터가 이해할 수 있는 기계어로 변환해주는 인터프리터 이다.
JIT을 사용하는 언어는 Java와 .Net등이 있다. 즉 자바에서만 사용개념이 아니다.
JIT을 좀더 쉽게 말하자면 동적변환이라고 할수 있으며, 프로그램 실행을 보다 빠르게 하기 위해서 태어났다. 명칭은 컴파일러지만, 실행시 동작한다.
역사적으로 프로그램을 실행하는 방식은 두가지로 나눌수 있는데, 인터프리터와 컴파일 방식 두가지이다. 인터프리터 방식은 프로그램에서 실행 할 때마다 기계어로 번역을한다. 따라서 간편하지만, 속도가 느리다. 반대로 컴파일 방식은 프로그램 실행전 모든 코드를 기계어로 번역후 실행한다. JIT은 이 두가지 방법을 혼합한 것이라고 보면 된다.
자바파일은 자바컴파일러에 의해 JVM이 이해할수있는 파일인 바이트코드로 변환되고, 이 바이트코드를 JIT컴파일로가 다시 기계어로 변환해 주어 CPU가 읽을 수 있다.
인터프리터는 코드를 한줄씩 읽으며 기계어로 번역하는데, 이러면 당연히도 속도가 느리다. 이런Interpreter의 단점을 보완하기위해 도입된것이 JIT컴파일러다. 인터프리터 방식으로 실행하다가, 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경, 이후에는 더이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식이다. 네이티브 코드는 캐시에 보관하기 때문에 한번 컴파일된 코드는 빠르게 수행된다. 물론 JIT컴파일러가 컴파일하는 과정은 인터프리팅 과정보다 훨씬 오래 걸리므로, 한번 만 실행되는 코드라면 컴파일하지 않고, 인터프리팅 하는 것이 유리하다. 따라서 JIT컴파일러를 사용하는 JVM들은 내부적으로 해당매서드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다. (JVM 관련 글을 적을때 내용을 가져왔다.)
HotSpot이란 무엇인가?
위의 그림을 보면 HotSpot VM이라는 영역을 볼수있고, 그림에선 나오지 않지만 HotSpot은 Client컴파일러와 Server컴파일러 두가지를 제공한다. 요즘과 다르게 예전에는 컴퓨터의 사양이 매우 낮았다. 그런점 때문에, 2개이상의 물리적 프로세서, 2GB이상의 물리적 메모리 두가지 조건을 충족하지 않으면 Client컴파일러를 제공, 적은 메모리점유율을 보여줬고, 위의 두가지 조건을 충족하면 Server컴파일러를 제공, 빠른 속도에 초점을 맞춘 환경을 제공했다.
왜 이름이 HotSpot인가? → JDK1.3 이전의 JVM들과 구분하기위함이다. 1.3이전 버전의 JVM을 ClassicVM으로 부른다.
Java를 배우면 꼭 알아야 하는 용어
해당 부분은 이미 포스팅한 적이 있으므로 해당 포스팅으로 대처한다.
해당 포스트를 작성하며 알게된 점
JIT 컴파일러가 Java뿐 아니라 다른 언어에서도 사용하는 개념이라는것을 알게됬다. 또, 관련 자료를 찾아보면서 .class파일이 기계어로 되어있다는 글을 찾았는데, 기계어가 아니라 JVM이 이해할수있는 이진수로 작성된 바이트코드 라는 피드백을 달았다. 글을 찾기만 하다가, 잘못된 점을 보고 피드백도 할수있게 되니 뭔가 기분이 좋았다.
Reference
JDK & JRE & JVM 의 역할
[출처] JDK & JRE & JVM 의 역할
자바의신2
'프로그래밍 > Java' 카테고리의 다른 글
상속과 컴포지션 (0) | 2021.05.20 |
---|---|
java.lang -1 WrapperClass (0) | 2021.05.18 |
GC (0) | 2021.05.18 |
JAVA의 역사와 JVM-1 (0) | 2021.05.18 |
Annotation (0) | 2021.05.17 |
Uploaded by Notion2Tistory v1.1.0