ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM, JRE, JDK
    Java/Basics 2020. 6. 14. 23:29

    ■JVM이란?


    - Java Virtual Machine의 줄임말


    Java Byte Code(.class)를 각 OS에 맞게 해석하고, 해석된 코드의


    실행 환경 구성 및 실행을 담당하는 가상 머신 (OS별 JVM 설치 필요)


    (아래에서 좀 더 자세히 살펴보자)




    ■JRE란?


    - Java Runtime Environment의 줄임말


    - JVM과 자바 실행에 필요한 기본적인 클래스 라이브러리(Java Class Library)를


    가지고 있다.


    - JRE를 다운로드받아 Java Byte Code(.class)를 실행시킬 수 있다.


    - Java파일을 컴파일할 수 없다.(Javac가 포함되어 있지 않음)


    - Oracle은 Java 11부터 JRE를 제공하지 않는다. Java 9 부터는 Jlink를 사용하여


    커스텀 Java 실행 모듈을 만들수 있다. 



    ■JDK란?


    Java Development Kit의 줄임말


    - JRE와 javac, jconsole, jhat 등의 개발에 필요한 툴을 포함하고 있다. 툴 목록 보기


    - JDK를 다운로드받아 Java Byte Code(.class)를 실행시킬 수 있고 .java파일을 컴파일 


    할 수 있다. 


    - Java로 프로그래밍을 하려면 JDK를 반드시 다운로드받아야 한다.


    - Oracle JDK 11부터 상용으로 사용할 경우에 한하여 유료이다. 


    즉,Oracle Openjdk나 타 벤더의 jdk는 특별한 공지가 있지 않는 한 무료이다.



    ■JVM의 정의


    - Java Virtual Machine의 줄임말


    Java Byte Code(.class)를 각 OS에 맞게 해석하고, 해석된 코드의


    실행 환경 구성 및 실행을 담당하는 가상 머신 (OS별 JVM 설치 필요)




    ■JVM을 왜 알아야 할까?


    - 어떤 프로그램을 효율적으로 사용하려면 그 프로그램의 실행 환경 구성을 알아야 


    한다. JVM으로 구동되는 프로그램의 경우, JVM이 프로그램 실행 전반에 관한 


    환경 구성을 담당한다.




    ■JVM의 특징


    Java Byte Code(.class)는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다.


    JVM은 Java Byte Code를 각 OS에 맞게 해석 해주는 역할을 하여 JVM 상에서 실행되는


    프로그래밍 언어에게 '운영체제에 독립적일 수 있다'는 장점을 선물한다.




    - JVM에선 코드 실행과 메모리 제어를 위해, Java Byte Code(.class)를 OS에 맞게 


    기계어로 해석하는 단계가 필수적이다. 따라서 타 언어(ex C, C++)의 실행환경에 


    비해 속도가 느리다. 하지만 JIT(Just In Time)컴파일러를 통해 속도 이슈를 


    극복했다.




    ■JVM Language (JVM에서 실행가능한 언어)


    Scala 

    Groovy 

    Clojure 

    Kotlin 

    Ceylon 

    Xtend 

    Fantom 

    X10 


    위 언어들은 컴파일을 거치게 되면 모두 class 파일을 생성하기 때문에 JVM에서


    실행할 수 있다. 그리고 kotlin은 컴파일하고 바로 java 명령어로 실행할 수 없다.


    왜냐하면 runtime에 필요한 라이브러리들이 필요하기 때문이다. 따라서 아래와


    같이 실행할 수 있는 파일을 만들 수 있다.

    kotlinc hello.kt -include-runtime -d hello.jar




    ■(Java 실행 과정에서 알아보는) JVM의 구체적인 역할

    프로그래머가 .java 파일을 작성한다. 그리고 java 컴파일러는 .java 파일을


    .class 라는 Java Byte Code로 컴파일한다. 


    이제부터 JVM이 작동된다. 


    Class Loader(클래스 적재기)는 load, link, initialize 세 단계로 구성된 프로세스를 


    수행한다. 


    Loading

     Java Byte Code를 Runtime Data Area 내의 Method Area로 적재

    (Java 8 이상부터는 metaspace에 적재)

    Linking 

     Java Byte Code가 자바 규칙을 따르는지 검증하고, 클래스에 정의된 

    필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며 

    그 클래스가 참조하는 다른 클래스를 로딩한다.

    Initialization 

     static block 의 초기화 및 static 데이터들을 할당한다.


    Class Loader가 수행되는 방식은 두가지로 나뉜다. 


    1. 로드타임 동적 로딩(load-time dynamic loading)


    .class 파일들을 로드하는 시점(로드타임)에 필요한 클래스들을 로드한다.


    2. 런타임 동적 로딩(run-time dynamic loading)


    로드타임 동적 로딩이 끝난 후 프로그램이 실행되면서(런타임) 필요한 


    클래스들을 로드한다. 


    * 클래스 로더 가져오기

    ClassLoader classLoader = Test.class.getClassLoader();
    System.out.println(classLoader);
    System.out.println(classLoader.getParent());
    System.out.println(classLoader.getParent().getParent());
    jdk.internal.loader.ClassLoaders$AppClassLoader@15db9742
    jdk.internal.loader.ClassLoaders$PlatformClassLoader@37a71e93
    null



    Execution Engine(실행 엔진)은 Runtime Data Area의 Method Area에 적재된


    Java Byte Code를 기계어로 컴파일한 후 실행시킨다. (컴파일 과정에서 JIT 컴파일러가 


    사용된다.) 또한 메모리를 효율적으로 관리하기 위한 Garbage Collection을 수행한다.



    'Java > Basics' 카테고리의 다른 글

    메모리 주소만으로 Heap의 인스턴스에 접근할 수 있을까?  (2) 2020.06.17
    Java Heap Dump  (0) 2020.06.15
    Java Heap (with GC)  (0) 2020.06.08
    자바 컨벤션 모음  (0) 2020.05.21
    자바 예외(Throwable)  (0) 2020.05.20

    댓글

Designed by Tistory.