ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-3] JVM과 JIT 컴파일러란?
    Java 2020. 11. 10. 12:15

    전 글에서는 JAVA의 바이트 코드에 대해서 알았다. 이번에는 그 바이트코드를 가지고 어떻게 실행하는지 알아보기 위해, 기본적인 JVM의 JIT 에 대해서 알아보도록 하자.

     

     

    먼저 실행을 하기 위해서는 생성된 class파일을 java 명령어로 실행을 시켜주면 된다. 

     

    예) $ java test.class 또는 $ java test 를 통해서 실행 가능한데, 

     

    JRE java 명령어를 실행했을 때의 상황인데, 간단하게 보자

     

    여기서 java 명령어를 통해서, JRE 가 등장하게 되는데, 한번 전에 말했던 JRE, JVM, JDK에 대해서 얘기해보자.

    JDK, JRE, JVM 에 대한 간단 설명

     

    JDK를 통해서 바이트 코드를 생성하고 JRE에게 던지게 된다. JRE를 사용해서 바이트코드를 JAVA명령어로 실행하게 되는데, JVM이 ‘실행’단계를 걸친다. 


    1. JVM에 대한 이해

     

    JAVA가 지금까지 특정 OS에 독립적 (즉, 어떤 운영체제에서든 잘 녹아들 수 있는)인 이유가, JVM에 있다. 자바는 어찌됬든 JVM과 서로 대화를 하는건데, JVM은 자바 언어를 특정 OS에 맞게 변경을 해줘야 하기때문에, 특정 플랫폼(특정 OS)에 종속적이게 된다. 그리고 이를 기계어로 변환해 주는게 JVM의 InterPreter와 JIT 이고, JVM을 통해 자바가 특정 OS나 플랫폼에 독립적일 수 있다는 거다. 

    그럼 JVM은 누가 만드는 걸까?

     

    예를들어 NVIDIA 라는 그래픽카드 회사가 있다. 이 회사는 그래픽카드를 만드는 것 뿐만 아니라, 특정 스펙을 만들어서 주변 공급업체인 MSI, GIGABYTE 같은 회사에게 전달해주면, 이 회사 들은 전달받은 스펙에 따라 그래픽카드를 만들어서 판매되게 된다. 


    JVM도 비슷하다. 

     

    Oracle 이라는 회사가, JVM의 스펙과 표준을 정의하면, 공급업체 들이, JVM을 실제 그래픽카드처럼 실물을 만들어서 배포하게 된다. 이 공급업체를 Vendor 라고 한다. 

     

    Vendor 는 공급업체

    이 그림을 보고 이해할 수 있으면 좋겠다. 

     

    자 여기서 JVM내에서 JIT 컴파일러에 대해서 나왔는데, 이 부분을 집고 넘어가도록 하자.

     

    2. JIT 는 뭔가요 (Just In Time)

     

     

    JIT에 대해서 말하기 전에, Java는 성능에 대한 이슈와 논쟁이 항상 있어왔다.

    자바가 느리다는 글과 질문 또는 답변이 1억 6백만이나 된다. 아마 주변에서도 자바 그거 너무 느리지 않냐? 라는 질문을 많이 받았을 수도 있다. 실제로 다른 인터프리터 언어들이, 뭐 정말, 하드웨어가 지금처럼 뛰어나지 않았을 때 에는 맞는 말일지도 모른다. 

     

    그건 자바의 특징인 인터프리터를 하는 과정과, 인터프리터 과정 전에, 컴파일 과정을 한번 걸쳐서 그러는데, 여전히 자바의 이런 특징 때문에, 여러 언어들로부터 공격을 받고 있는 이유 중 하나이다. 

     

    출처 : 자바 vs python

    출처 : 자바 vs Pythone 영상

    위 동영상의 내용은 바이트코드로 컴파일 하는 과정이, 성능(시간)에 영향을 미친다. 파이썬은 그렇지 않다 정도의 내용이다.  

     

    자바는 바이트코드로 한번 컴파일 하는 과정과, 바이트코드를 인터프리터 하는 방식 2가지를 진행하기 때문인데, 가뜩이나 인터프리터 방식은 소스코드를 런타임시에 한줄 한줄 읽어 들여야 하는 방식 때문에, 컴파일 방식보다 느린건 만연한 사실이다. 

     

    (1) 컴파일 방식 : 소스코드를 한꺼번에 컴퓨터가 읽을 수 있는 native machine (기계)어로 변환

    (2) 인터프리터 방식 : 소스코드를 빌드시에 암것도 하지 않다가, 런타임시에 한줄 한줄 읽어가며 변환

     

    둘 다 장단점이 있는 방식이지만, 여기서 중요한건 자바는 컴파일과 인터프리터 방식을 모두 사용한 다는 것이다. 

    그래서 JIT컴파일러를 도입하게 된거 같다., 이미 한번 읽어서 기계어로 변경한, 소스코드는 번역하지 않는다. 더 자세히 보면,

    이런식으로 저장소에 저장을 한다는 개념이다. 정확히는 반복되는 코드를 모두 컴파일러로 컴파일 시키는거다. 그래서 인터프리터의 역학을 보조? 해준다고 생각하면 되는데, 인터프리터는 읽을 때, 반복되는 코드로 컴파일된 코드를 바로 사용할 수 있어서 개꿀이다.ㅎㅎ

    정확히는 JIT 컴파일러가 "번역 안할래~" 가 아니라, 인터프리터가 안읽어도 된다고 생각하는게 더 옳다. 


    대충 이런식으로 동작하고 있다. JIT 에 대한 내부동작방식을 다룬 블로그가 있으니 참고하면 좋다.

     

    다음은 JVM 구조에 대해서 알아보도록 하자.

     

    > [Java-4] JVM의 구조

    'Java' 카테고리의 다른 글

    [Java-5] JDK& JRE, 자바 실행  (2) 2020.11.11
    [Java-4] JVM의 구조  (1) 2020.11.11
    [Java-2] 바이트 코드란  (1) 2020.11.09
    [Java-1] 컴파일 방법 & 과정  (14) 2020.11.09
    함수형 인터페이스란?  (0) 2020.10.27

    댓글

Designed by Tistory.