[Java] JVM 동작 및 실행 과정
Java

[Java] JVM 동작 및 실행 과정

728x90

JVM 구조

JVM 은 크게 4가지 구성요소로 이루어져있습니다.

 

1. 클래스 로더 시스템 (Class Loader System)

클래스 로더 시스템은 자바 바이트코드(*.class)를 실행시점(RunTime)에 읽어들여서 JVM의 메모리 영역(Runtime Data Area)에 적절하게 배치시켜주는 역할을 합니다.

크게 로딩 -> 링크 -> 초기화 순서로 진행됩니다.

  • 로딩 (Loading): 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메서드 영역에 저장합니다. 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 “heap" 영역에 저장합니다.
  • 링크 (Linking): Verify(확인), Prepare(준비), Resolve(해결) 3 단계로 나누어져 있습니다.
  • 초기화 (Initialization): static 변수의 값을 할당합니다. static 블럭은 이때 실행됩니다.

    
2. 메모리 (Runtime Data Areas)

JVM이 실행되기 위해 OS로부터 할당받는 메모리 영역입니다. 목적에 따라 크게 5가지 블럭으로 나뉩니다.

  • 메소드 영역(Method Area):
    • 메서드 영역에서는 런타임 상수풀(Constant Pool), 필드와 메소드 데이터 내용, 즉 클래스 수준의 정보를 저장하게 된다. 
  • 힙 영역(Heap): 
    • 힙은 인스턴스화 된 모든 클래스 인스턴스와 배열을 저장, 객체를 저장하게 되는데, 모든 JVM 스레드에 공유 되는 공유 자원 이다. 힙에 저장된 할당된 메모리 회수 권한은 무조건 가비지 컬렉터(Garbage Collector)에 의해서만 회수가 가능하다. 
  • 스택 영역(Java Stack):
    • LIFO 동작으로 동작하는 자료구조로써, 쓰레드 마다 런타임 스택을 만들고, JVM 스택에는 프레임에 저장된다. 메서드 하나가 호출될 때마다 새 프레임이 생성되어 스택에 쌓이고, 메서드 호출이 정상 완료되거나 예외가 던져지면 프레임은 스택에서 빠지면서 소멸된다. 또한 쓰레드가 종료되면 스택도 제거된다. 
  • PC 레지스터(PC Registers):
    • PC레지스터는 현재 실행중인 메서드가 네이티브가 아니면, 현재 실행중인 JVM 명령어 위치에 저장되고, 네이티브이면 Pc 레지스터에 저장되는 값은 정의되지 않는다. CPU의 Register와는 다르게,  연산을 위해 필요한 피연산자를 임시로 저장하기 위한 용도로 사용한다.
  • 네이티브 메소드 영역(Native Method Stacks):
    • 네이티브 메서드 스택은 JVM의 스택이 아니라 C 스택을 가르킨다. 자바가 아닌 다른 언어로 작성된 네이티브 메서드를 지원하기 위해 사용되는 스택이다. 네이티브 메소드 스택은 JVM 스택과 마찬가지로 스레드 단위의 자료구조 이다. 

 

3. 실행 엔진

클래스 로더를 통해  Runtime Data Areas에 배치된 바이트코드를 명령어 단위로 읽어서 실행합니다. 이때 두가지 방식 (JIT 컴파일러, 인터프리터)의 조합을 통해 실행됩니다. 

 

4. 네이티브 메소드 처리

  • JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 Native 키워드를 사용한 함수를 사용할 수 있는 방법 제공
  • 네이티브 메소드 라이브러리: C, C++로 작성 된 라이브러리

 

JVM 에서 이 같은 과정을 거쳐서 기계어로 하드웨어에 전달되고, 코드가 실행됩니다!

 

출처:
- [Java-4] JVM의 구조 (maru's 원자적 사고)
- JVM 동작과 실행과정 (M_Story)
- JVM에 관하여 - Part 3, Run-Time Data Area (Tecoble)

 

728x90