JVM 구조 및 동작방식

youngseoKim·2022년 2월 21일
0
post-thumbnail

0. JVM 이란?

JVM은 Java.Virtual.Machine 의 줄임말이며, Java Application의 런타임 엔진입니다.
JVM은 실제로 Java code의 main method를 실행시키는 역할을 하고 있습니다.
컴파일러가 .java 파일을 컴파일할 때, .class 파일을 생성시킵니다.
이 .class 파일을 실행시킬 때 여러 단계를 거치게 되는데, 이때 JVM이 동작하게 됩니다.

JVM은 Class Loader, JVM Memory, Excution Engine, Native Mothod Interface로 구성되어 있습니다.

1. Class loader

Class loader는 JVM Architecture 중 일부분이며, .class 파일을 전달받습니다.
전달받은 .class파일을 동적으로 JVM에 로드합니다. (Dynamic Loading)
.class들은 한 번에 로드되지 않고, 필요할 때 로드됩니다.

Class Loader는 3가지의 역할을 담당합니다.

  • Loading
  • Linking
  • Initialization

1.1 Loading

Class loader는 .class 파일에서 바이너리 데이터를 생성한 뒤
method 영역(JVM 구조에 속함.)에 저장합니다.
이후 JVM은 Class 형식의 객체를 생성하고 이를 Heap 영역에 저장합니다.

우리가 Java 프로그램에서 getClass() method를 사용할 수 있는 이유입니다.

1.2 Linking

  • Verification
    • .class 파일들의 정확성을 보장합니다. 올바른 형식으로 지정되고,
      유효한 컴파일러에 의해 생성되었는지 검증합니다.
      만약 아니라면 java.lang.VerifyError 예외를 던집니다.
  • Preparation
    • JVM은 클래스 변수에 메모리를 할당하고, 기본값을 초기화합니다.
  • Resolution
    • symbolic 한 참조를 direct 참조로 변경합니다.

1.3 Initialization

모든 정적변수에 정의한 값이 할당됩니다.
이 과정은 계층 구조인 클래스로더가 실행하게 됩니다.

1.4 Class Loader의 계층구조

1.4.1 Bootstrap Class Loader

.class파일들은 Class Loader가 불러오게 됩니다.
이때 고민해야 할 점은 Class Loader도 결국엔 java.lang 패키지에 속한 class라는 점입니다.
과연 이 class는 누가 실행시킬까요?

바로 Bootstrap Class Loader가 동작하게 됩니다.

Bootstrap Class Loader는 JVM의 핵심이며, java native code로 작성되어있습니다.

1.4.2 Extension Class Loader

Extension Class Loader는 Bootstrap Class Loader의 자식입니다.
Extension Class Loader는 표준 Java class의 extension들을 로드합니다.
이는 JDK Extention Library를 의미합니다.

1.4.3 System Class Loader

System Class Loader는 Extension Class Loader의 자식입니다.
System Class Loader는 모든 응용프로그램 수준의 class들을 로드합니다.
이는 classpath로 잡은 class들을 의미합니다.

2. JVM Memory

Java 프로그램을 실행할 때 사용되는 데이터들을 저장하는 공간입니다.
Class Loader가 생성한 객체가 저장되는 곳이 이곳입니다.

구성은 다음과 같습니다.

  • Method
  • Heap
  • Stack
  • PC Registers
  • Native method stacks

2.1 Method 영역

이곳에는 정적 변수를 포함한 클래스 이름, 메소드 및 변수 등과 같은 class 수준의 정보가 저장됩니다.
이곳은 공유영역이며, JVM에 한 개씩만 존재하고 모든 Thread끼리 공유합니다.

2.2 Heap 영역

모든 객체의 정보가 저장됩니다. 즉 new 키워드로 생성된 객체를 뜻합니다.
이곳은 공유영역이며, JVM에 한 개씩만 존재하고 모든 Thread끼리 공유합니다.

2.3 Stack 영역

각 Thread 당 Runtime Stack이 생성됩니다.
메소드 호출 시 메소드에서 사용되는 값들을 저장합니다.
메소드의 수행이 끝나거나, Thread가 종료되면 JVM에 의해서 파괴됩니다.

2.4 PC Registers 영역

Thread의 현재 명령에 대한 주소 값을 저장합니다.
Thread 별로 한 개씩 존재합니다.

2.5 Native method stacks 영역

JAVA가 아닌 Native method에 대한 정보를 저장합니다.
JNI(Java Native Interface)와 연동됩니다.

3. Execution Engine

Execution Engine은 .class 파일을 실행합니다. 바이트 코드를 한 줄씩 읽으며 실행합니다.
Execution Engine은 3가지의 역할을 담당합니다.

  • Interpreter
  • Just-In-Time Compiler
  • Garbage Collector

3.1 Interpreter

바이트 코드를 한줄씩 읽으며 실행합니다.

3.2 Just-In-Time Compiler

컴파일러는 .class 파일을 읽고 다시 기계어로 변환합니다.
이는 작업비용이 많이 들며 속도가 느린 이유입니다.
Just-In-Time Compiler 방식을 사용하면 변환된 기계어를 저장해두었다가 재사용합니다.

3.3 Garbage Collection

참조되지 않은 객체를 알아서 소멸시켜줍니다.

4. Native Method Interface

Native Library를 제공하는 인터페이스입니다.
C 또는 C++ 라이브러리를 호출할 수 있습니다.

profile
현재 마크애니 블록체인팀에서 블록체인 솔루션과 DAPP 파트를 개발하고 있습니다. 서버 개발과 운영 , 클라우드 서비스에 관심이 많습니다.

0개의 댓글