2 분 소요

JVM

JVM이란?

  • Java 어플리케이션을 실행하기 위한 run-time engine
  • 자바 코드에서 main method를 실행한다.
  • JRE (Java Runtime Environment)의 일부이다.

JVM 등장 배경

  • 자바 어플리케이션은 WORA (Write Once Run Anywhere)라고 불린다.
  • 즉, 프로그래머가 한번 자바 코드를 작성하면, 이는 자바 실행이 가능한 모든 시스템에서 동일하게 동작한다는 뜻이다.
  • 이게 가능한 이유가 JVM 덕분이다.

JAVA의 실행 방식

  • 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트 코드(.class)로 변환시킨다.
  • 이 .class 파일들은 다음과 같은 과정을 통해 실행된다. ( → JVM 동작 방식)
    • Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
    • 로딩된 class 파일들은 Execution engine을 통해 해석된다.
    • 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어진다.

JVM의 구조

  • Class Loader, Execution engine, Runtime Data Area, JNI, Native Method Library로 이루어짐

image

1. Class Loader

  • Loading
    • .class 파일들을 읽어서 binary data를 생성 → method area에 저장한다.
    • “.class” file 로딩이 끝나면, JVM은 Object 클래스를 생성한다. (heap memory에 이 파일을 나타내기 위해)
      • 이 Object 클래스는 java.lang 패키지에 정의된 그 Object 클래스이다.
      • 프로그래머는 이 Object Class로 해당 클래스의 이름, 부모의 이름, 메소드와 변수 등의 정보를 알 수 있다. (→ Object 클래스의 getClass() 메소드로 얻을 수 있음)
  • Linking
    • Verification
      • .class 파일의 정확성을 검사한다.
      • 만약 verification이 실패하면 Run-time Exception이 발생
    • Preparation
      • 클래스 내 static 변수를 위한 메모리를 할당하고, 초기화
    • Resolution (Optionally)
      • symbolic reference들을 direct reference로 교체해주는 작업
  • Initialization
    • 모든 static 변수들에 값이 할당됨

2. JVM 메모리 구조

image

  • Method area
    • 이 메모리 영역에는 모든 클래스 정보가 저장됨 (클래스 명, 부모 클래스 명, 메소드, 변수 정보 등..)
    • JVM 당 하나씩 존재하며 shared resource이다.
  • Heap area
    • 모든 object 정보가 여기에 저장됨
    • JVM 당 하나씩 존재, shared resource
  • Stack area
    • 각각의 Thread 마다 JVM은 Stack area에 run-time stack을 생성한다.
    • 각각의 stack 블록은 run-time stack / stack frame이라고도 불리며, 각 스레드에서 호출된 method들을 저장한다. 또한, 해당 method 내의 모든 로컬 변수들이 저장된다.
    • 스레드가 끝나면, 그 스레드의 run-time stack이 JVM에 의해 destroy된다.
    • shared resource가 아니다.
  • PC Registers
    • 한 스레드에서 현재 실행 중인 명령의 주소를 저장
    • 당연히, 모든 스레드는 각자의 PC Registers를 갖는다.
  • Native method stacks
    • 모든 스레드는 각각 분리된 native stack을 갖는다. 이는 native method 정보를 저장함

3. Execution Engine (실행 엔진)

  • “.class”(bytecode)를 실행한다.
  • byte-code line을 한 줄씩 읽어서 memory area에 존재하는 데이터들을 활용하여 명령을 실행함.
  • Execution Engine은 다음과 같이 3개의 part로 구성됨
    • Interpreter
      • bytecode를 line by line으로 읽어서 실행함.
      • 단점 : 하나의 메소드가 여러 번 호출될 때, interpretation이 매번 수행된다.
    • Just-In-Time Compiler (JIT)
      • interpreter의 효율성 향상을 위해 등장함.
      • 모든 bytecode를 compile해서 native code로 바꾼다. 따라서 interpreter가 같은 메소드를 반복해서 호출할 때, JIT가 direct native code를 제공한다. ⇒ interpretation이 반복적으로 일어나지 않음 → 효율성이 증대된다.
    • Garbage Collector
      • un-reference object를 제거한다.

reference

https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

태그: , ,

카테고리:

업데이트: