ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JDK / JRE / JVM은 무엇이고 어떻게 동작할까?
    IT/개발(자바, 서블릿, 스프링 등) 2019. 12. 5. 23:40

     

     

    소스파일(고급언어. EX: JAVA 소스코드, C 소스코드)을 컴파일러로 컴파일하여 실행파일(저급 언어. EX: 바이트 코드, 기계어 코드)로 만든다.

     

    자바는 다른 언어와 다르게 컴파일 후 생성된 결과물이 기계어 코드가 아니다. 바이트 코드다. 바이트 코드는 기계어로 변환하기 전 중간 단계의 코드이다. 컴퓨터는 기계어만 이해한다. 따라서 바이트 코드는 컴퓨터에서 바로 실행할 수 없다. 바이트 코드를 기계어 코드로 변경하는 작업은 자바 가상 머신(JVM, Java Virtual Machine)에서 담당한다. 바이트 코드를 사용자가 실행하려면 반드시 JVM이 설치되어 있어야 한다. JVM은 각 OS에 맞는 것을 설치하면 된다.

     

     

    test.c     ->  (컴파일)  -> test.exe   -> (실행)   ->  컴퓨터

    test.java  -> (컴파일)  -> test.class  -> (실행)   ->  JVM       ->   컴퓨터

     

     

    test. java 소스파일

    (컴파일)

    test.class 실행파일 바이트코드

    (실행)

                ↓                                  ↓                              ↓               

    Windows JVM                          Linux JVM                   Solaris JVM

    ↓                                  ↓                              ↓    

    Windows 기계어코드                     Linux 기계어코드               Solaris 기계어코드

                                                      

     

    C언어는 운영체제별로 컴파일러를 선택해 컴파일해야 한다. 어느 파일을 윈도우 운영체제에서 윈도우용 컴파일러를 사용해 컴파일하고, 리눅스 운영체제에서 다시 사용하려면 리눅스 컴파일러로 다시 컴파일해야 한다. 자바는 다르다. 자바의 큰 장점은 운영체제가 달라져도 추가적인 작업을 할 필요가 없다. 컴파일 된 실행파일은 운영체제에 맞는 JVM만 설치되어 있다면 추가적인 작업을 할 필요 없이 어떤 운영체제에서도 실행할 수 있다. 운영체제와 자바 실행 파일 사이에 JVM이 있어서 각 운영체제에서 실행할 수 있도록 처리하기 때문이다. 때문에 C는 플랫폼에 종속적인 언어이고, 자바는 플랫폼에 독립적인 언어이다. 

     


    이제 JVM이 어떻게 동작하는지 세부적으로 알아보자.

    소스파일 -> 컴파일 -> 실행파일 -> JVM [ Class loader -> Bytecode verifier -> Just-In-Time compiler -> Runtime System ] -> OS -> Hardware

     

     

    자바 프로그램이 실행될 때 위와 같이 JVM은 일정한 처리 과정을 거친다.

     

    클래스 로더(Class loader)는 실행에 필요한 모든 실행 파일(*.class)을 찾아준다.

     

    바이트 코드 검증(Byte code verifier)은 클래스 로더가 모든 실행 파일을 준비한 후에 이 파일의 코드가 올바른지 검증한다. 코드가 정해진 규칙에 따라 작성되었는지, 컴퓨터에 문제를 일으킬만한 코드는 없는지 검증한다. 프로그램 실행 시점에 코드의 유효성을 검증하므로 보안에 강하다는 장점이 있다.

     

    바이트 코드를 기계어 코드로 변환하는 방식에는 인터프리터 방식과 JIT 컴파일러(Just in time compiler) 방식이 있다. 인터프리터 방식은 기계어로 변환하는 작업을 명령문 단위로 처리한다. JIT 컴파일러 방식은 소스 파일을 실행파일로 파일 전체를 한번에 기계어로 변환한다. 자바 초기에는 인터프리터 방식을 사용하다가, JIT 컴파일러 방식으로 보완하게 되었다. 미리 컴파일해놓고 실행하므로 처리 속도가 더 빠르기 때문이다.

     

     

    인터프리터 방식

    명령문 -> System.out.println("Hello World!");  -> 코드 변환  -> 실행

    명령문 -> System.out.println("Hello World!");  -> 코드 변환  -> 실행

     

    컴파일 방식

    명령문 -> System.out.println("Hello World!");  ㄱ

    명령문 -> System.out.println("Hello World!");  ㅡ  -> 코드 변환  -> 실행

     


    그렇다면 JDK, JRE는 뭘까?

    JRE(Java Runtime Environment)는 JVM을 포함하고 있다. 뿐만 아니라, 자바 실행에 관련된 파일들도 함께 가지고 있다. JDK(Java Development Kit)는 JRE를 포함한다. 뿐만 아니라, 개발에 필요한 프로그램들도 포함되어 있는 도구이다. 컴파일러(javac), 실행파일을 실행하는 프로그램(java) 등이 포함되어 있다. Java 11 버전부터는 JDK가 JRE를 포함하기 때문에 별도로 구분하여 내려받지 않는다.

     

    JDK를 설치하면, OS가 JVM을 올바르게 인식하도록 JAVA_HOME이라는 시스템 변수에 JDK가 설치된 폴더를 지정한다. 운영체제의 시스템 변수 중 Path에 특정 폴더를 지정해놓으면 어느 곳에서나 해당폴더에 있는 프로그램을 실행할 수 있게 되어 편리하다. 자바 프로그램을 작성하고 실행하려면, 운영체제는 현재 위치에서 프로그램을 찾아 실행한다. 만약 현재 위치에서 프로그램을 찾지 못하면, Path라는 시스템 변수에 지정된 폴더를 차례대로 찾는다. JDK가 설치된 폴더 하위의 bin 폴더에는 자바 프로그램을 개발하는데 필요한 도구들이 있다. 따라서 이 폴더를 Path에 추가해야 한다. Path 값을 추가하고 위로 이동을 눌러 가장 상단으로 위치를 이동하면, 최우선적으로 검색대상이 될 수 있다.

     

    아래부터 설명할 프로그램명은 윈도우 기준이다.

    jdk설치한 곳에 bin( C:\Program Files\Java\jdk1.7.0_45\bin ) 폴더 하위에 있는 있는 개발 도구들을 살펴보겠다.

     

     

     

    프로그램명기능사용법예시
    javac.exe컴파일러javac [파일명].javajavac Test.java
    java.exe
    jar.exe

    java.exe로 클래스 파일을 실행할 때, public static void main(String[] args){} 메소드를 찾아서 {} 블록 내에 있는 소스코드를 실행하도록 되어있다.

Designed by Tistory.