ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM 이해
    Computer Science 2020. 12. 19. 17:39

    JVM의 역할

    • Java Byte Code를 OS에 맞게 해석해주는 역할
      • JVM이 Byte Code를 해석해주기 때문에 OS에 종속적이지 않고 실행 가능 (플랫폼 독립적)
    • 또한 GC, 메모리 관리 등을 수행한다.

    JVM 실행 과정

    .java -> (javac) -> .class -> (jvm) -> process

    • Java Compiler는 .java 파일을 .class (java byte code)로 변환
    • byte code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않음
    • 이 때 JVM이 OS가 Byte Code를 이해할 수 있도록 해석해줌
      • Byte Code는 JVM위에서 OS에 상관없이 실행
    • JVM의 해석을 거치기 때문에 c언어와 같은 로우레벨 언어에 비해 속도가 느림

    JVM 구조

    .java → (javac) → .class→ (Class Loader) → Runtime Data Area

    • .class (byte code)는 Class Loader가 Runtiem Data Area에 로딩시킴


     

    JVM 관련 용어

    Class Loader

    RunTime 시점에 클래스를 로딩하게 해주며, 클래스의 인스턴스를 생성하면 Class Loader를 통해 메모리에 로드하게 됩니다.

    Runtime Data Areas

    JVM이 프로그램을 수행하기 위해 OS로 부터 별도의 할당받은 메모리 공간을 말합니다.

     

    • Method Area와 Heap 영역은 모든 쓰레드가 공유
    • Method 영역은 JVM이 시작될 때 생성되는 공간으로 바이트 코드가 이영역에 저장된다.
    • 클래스 정보, 변수 정보, static으로 선언한 변수가 저장되고, 모든 쓰레드가 공유하는 영역
    • Heap 영역은 동적으로 생성된 저장되는 영역. GC의 대상이 되느 ㄴ공간
    • Stack 영역은 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역
    • PC Register는 쓰레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간. 그러니까 스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간 (?)
    • Native Method Stacks는 Java가 아닌 다른언어로 작성된 코드를 위한 공간. 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 공간

    Execution Engine

    Load된 Class의 ByteCode를 실행하는 Runtime Module

    Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행(인터프리터)

    바이트 코드를 실행시키는 엔진

    인터프리터는 명령어를 한줄 한줄 읽어가며 실행

     


    JIT Compiler

    최초 JVM이 나왔을 때는 Interpreter 방식이였기 때문에 속도가 느리다는 단점이 있었지만, JIT Compiler 방식을 통해 이점을 보완.

    JIT는 ByteCode를 어셈블리어 같은 NativeCode로 바꿔서 실행이 빠르지만 역시 변환하는데 비용이 발생.

    이 같은 이유로 JVM은 모든 코드를 JIT Compiler 방식으로 실행하지 않고, Interpreter 방식을 사용하다 일정 기준이 넘어가면, JIT Compiler 방식으로 실행

    반복되는 코드는 JIT 로 실행. 이외에는 Interpreter 방식으로 실행


    Q. JVM은 무엇인가? (JVM의 역할은?)

    • 자바 바이트 코드를 해석하여 OS에 관계없이 실행해주는 역할
    • GC를 통해 사용되지 않는 메모리를 해제시켜주는 메모리 관리 역할

    Q. Java는 왜 JVM을 쓰는가

    OS에 독립적으로 실행가능한 환경을 만들기 위해 JVM을 사용합니다.

    Java는 C언어와 달리 컴파일을 통해 기계어로 변환되는 것이 아니라 바이트코드 형식으로 변환이 됩니다. 바이트코드는 CPU가 즉시 해석하지 못하기 때문에, JVM이 ByteCode를 해석하는 과정을 거쳐야 실행가능한 프로세스로서 동작할 수 있습니다.

    C언어는 전처리기, 컴파일러, 어셈블러, 링커 과정을 거쳐 바이너리 파일로 만들어집니다. 이렇게 만들어진 실행파일을 실행하면 바이너리 파일의 내용들이 RAM에 적재되어 시스템에서 동작하게 됩니다.

     

    Q. Interpreter란?

    컴파일러는 Runtime 전에 전체 소스코드를 검사하여 오류 메세지를 생성한 후 문제 없으면 Runtime

    인터프리터는 런타임에 한번에 한문장씩 변환


    [더 자바] JVM 이해하기

    [Java] JVM 메모리 구조

    'Computer Science' 카테고리의 다른 글

    Array & List  (0) 2020.12.23
    Java Collection Framework  (0) 2020.12.21
    의존성 주입(Dependecy Injection) 이란?  (0) 2020.12.17
    커널(Kernel)  (0) 2020.12.09
    Garbage Collector 이해  (0) 2020.12.01
Designed by Tistory.