Java

JVM(Java Virtual Machine)의 구조

딱구킴 2022. 10. 20. 15:17

이번 글에서는 JVM의 구조에 대해 다뤄보도록 하겠습니다.

 

JVM은 Java가 Write Once, Run Anywhere를 지킬 수 있도록 도와주는 가상 머신이며, OS에 대해 독립적으로 Java 애플리케이션을 실행할 수 있도록 도와주는 중요한 역할을 합니다. 

 

출처 : https://www.inflearn.com/course/the-java-code-manipulation/dashboard

클래스 로더

  • .class 파일을 JVM에 로딩 (바이트 코드를 읽어 메모리에 저장)
  • 크게 다섯 가지 과정을 거칩니다.
    • 로딩 : .class 파일을 JVM 메모리에 로드
    • 검증 : 자바 언어 명세 or JVM 명세에 명시된 대로 구성되었는지를 검증
    • 준비 : 클래스가 필요로 하는 메모리를 준비하여 할당(필드, 메서드, 인터페이스...)
    • 링크 : 클래스의 상수 pool 안의 모든 Symbolic reference를 분석하여 direct reference로 연결
    • 초기화 : 클래스 변수들을 적절한 값으로 초기화
  • Symbolic reference? Direct reference?

 

메모리

  • JVM의 메모리에는 총 다섯가지의 메모리 영역이 있습니다. 크게 공유되지 않는 자원과 공유 자원으로 구분됩니다.
  • 공유되지 않는 자원 (Managed per-thread)
    • 스택 영역
      • 쓰레드 마다 런 타임 스택을 만들고, 그 안에 메소드 호출을 스택 프레임이라고 부르는 블럭으로 쌓습니다.
      • 쓰레드를 종료하면 런타임 스택도 사라집니다.
      • 예외가 터지면 Stack Trace로 스택이 무엇이 실행되었는지 확인할 수 있습니다.
      • 일반적인 메서드나 기본형 타입 변수가 해당 영역에 할당됩니다.
      • StackOverFlowError, OutOfMemoryError가 발생되는 영역입니다.
    • PC 레지스터(Program counter) 영역
      • 새 쓰레드가 생성될 때마다 PC 레지스터가 생성됩니다. 
      • 쓰레드 마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성됩니다. 
    • 네이티브 메서드 영역
      • 네이티브 메서드에 사용됩니다.
      • 실제 실행 가능한, 기계어로 작성된 프로그램을 실행시킵니다.
      • 쓰레드 별로 생성됩니다.
  • 공유 자원 (Shared with all threads)
    • 힙 영역
      • JVM 시작 시 할당됩니다. 
      • Object를 할당하는 영역입니다. (new 연산자로 생성된 것)
      • 힙 메모리는 공유 자원이기 때문에, 여러 쓰레드에서 공유됩니다.
      • 해당 영역에 Garbage Collection이 수행됩니다.
      • 런타임에 할당된 메모리가 충분하지 않을 경우, OutOfMemoryError가 발생됩니다.
    • 메서드 영역
      • 클래스와 static 필드가 할당되는 영역입니다.
      • JVM 시작 시 할당됩니다.
      • 공유 자원이기 때문에, 여러 쓰레드에서 공유됩니다.
      • 런타임에 할당된 메모리가 충분하지 않을 경우, OutOfMemoryError가 발생됩니다.

 

실행 엔진(Execution Engine)

  • 실행 엔진에는 크게 2 가지의 엔진이 있습니다.
    • 인터프리터
      • 바이트 코드를 한 줄씩 실행합니다.
      • 한 줄씩 이해하고 실행하고를 반복합니다.
    • JIT 컴파일러
      • Just-In-Time 컴파일러
      • 인터프리터의 효율을 높이기 위해 만들어졌습니다.
        • 인터프리터가 반복되는 코드를 발견할 경우, JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿉니다.
        • 인터프리터가 네이티브 코드로 컴파일된 코드를 바로 사용합니다
    • GC(Garbage Collector)
      • 더이상 참조되지 않는 객체를 모아서 정리합니다.
      • Heap 영역에서 Garbage Collection을 수행합니다.

 

JNI(Java Native Interface)

  • 자바 애플리케이션에서 C, C++, 어셈블리로 작성된 네이티브 함수를 사용할 수 있는 방법을 제공합니다.
  • Native 키워드를 사용한 메서드를 호출합니다.

 

네이티브 메서드 라이브러리

  • C, C++로 작성된 라이브러리를 의미합니다.

 

 

 

참고

https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register

https://www.inflearn.com/course/the-java-code-manipulation/dashboard