ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] JVM 동작 방식
    Computer Science/Java 2024. 2. 6. 20:52
    1. JVM이란
    2. Class Loader
    3. Execution Engine
    4. Runtime Data Areas

    JVM이란

    JVM은 Java Virtual Machine의 약자로 자바 바이트코드를 실행하는 가상 머신입니다.

    자바는 Compile시 자바 Source Code가 바이트코드 ( .class 파일 ) 로 변환되며 이 바이트코드가 JVM에서 실행되는 구조입니다. 

     

    JVM 구성도

     

    JVM ( Java Virtual Machine )의 동작 구조를 간단히 설명하면 다음과 같습니다.

    1. Class Loader는 실행할 프로그램의 Class를 Runtime Data Areas에 Load 합니다.
    2. Load 된 Class는 Execution Engine 에 의해 실행됩니다.

    Class Loader

    Class Loader 구조

     

    Class Loader의 동작 방식을 자세히 보면 다음과 같습니다.

    1. 로딩 ( Loading ) : Class Loader는 .class 파일을 JVM의 메모리에 로드합니다.
                                   자세하게는 바이너리 형태의 Class data 가 Method Area에 저장됩니다.
    2. 링킹 ( Linking )  : 로드된 Class data는 JVM에서 사용될 수 있도록 링킹 과정을 거치는데 크게 3가지 단계로 이루어집니다.
      1. 검증 ( Verification )  : 로드된 Class가 JVM의 안전한 실행을 위반하지 않는지 검사합니다.
                                            예를들어 형식의 안정성, 액세스 권한 위반 ( private 또는 protected 접근 ) 등을 확인합니다.
      2. 준비 ( Preparation ) : Class 변수 ( Static 변수 ) 에 메모리를 할당하고, 기본값으로 초기화 합니다.
                                           이때 초기화하는 값은 타입에 따른 기본값 ( int의 경우 0 ) 을 할당합니다.
      3. 해석 ( Resolution )   : 심볼릭 메모리 레퍼런스를 Method Area에 존재하는 실제 레퍼런스로 교체합니다.
    3. 초기화 ( Initialization ) : Class 변수들에 대해 정의된 초기값을 설정합니다. 이 과정에서 정적 초기화 블록이 실행됩니다.

    Execution Engine

    실행 엔진은 .class 파일의 바이트코드가 Class Loader에 의해 Load된 바이트코드를 기계어로 변환하여 실행하는 역할을 담당합니다.

    실행 엔진은 크게 3가지로 구성이 되어있는데 다음과 같습니다.

    • 인터프리터 ( Interpreter ) : 바이트코드를 한 줄씩 읽어서 바로 실행합니다.
    • JIT ( Just-In-Time ) 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 것으로 실행 되는 동안 바이트코드의 핫스팟(HotSpot) 즉 반복적으로 실행되는 코드 부분을 식별하고, 이를 기계어로 변환하여 실행 속도를 향상시키는 것입니다.
      변환된 코드는 캐시에 저장되어 있으며 이후 지속적으로 재사용됩니다.
    • 가비지 컬렉터 ( Garbage Collector ) : 프로그램 실행 중에 생성된 객체 중에서 더 이상 참조되지 않는 객체를 자동으로 검출하고, 이를 삭제하여 메모리를 관리합니다.

    Runtime Data Areas

    Runtime Data Areas 구성도

     

    Runtime Data Area는 Runtime 시에 사용하는 메모리 영역이며 크게 5개로 분류됩니다.

    1. Method Area : 모든 스레드가 공유하는 영역으로, 클래스 정보를 가지고 있습니다.
                                 각 클래스의 구조, 상수 풀, 정적 변수, 바이트코드 등 메타데이터가 저장되어 있습니다.
    2. Heap : 모든 스레드가 공유하는 영역으로, 대부분의 메모리를 차지합니다.
                   인스턴스 객체 및 배열 등 동적으로 할당된 데이터를 저장합니다. GC ( Garbage Collection ) 이 이 영역에서 발생합니다.
    3. Stack : 각 스레드마다 하나씩 생성되며, 메소드 호출 및 실행을 관리합니다.
      메소드 호출마다 Frame이 스택에 생성되며 Frame에는 로컬 변수, 결과 등이 담겨있습니다.
      메소드가 종료되면 Frame도 사라집니다.
    4. PC Register ( Program Counter Register ) : 각 스레드마다 하나씩 생성되며, 현재 실행중인 JVM 명령의 주소를 관리합니다. 이로써 각 스레드가 현재 어느 명령어를 실행중인지 알 수 있습니다.
    5. Native Method Stack : 각 스레드마다 하나씩 생성되며, Java가 아닌 다른 언어로 작성된 메소드를 관리합니다.

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

    [Java] GC 종류별 메모리 상황에 따른 테스트  (0) 2024.02.08
    [Java] 버전별 GC 목록 ( OpenJDK )  (0) 2024.02.07
    Mac 터미널 java version 임시 변경  (0) 2022.11.10
    SOLID  (0) 2022.10.05
    open-jdk-17 설치.  (0) 2022.07.27
Designed by Tistory.