JVM

JVM(Java Virtual Machine)은 java로 작성된 소스코드를 플랫폼 독립적으로 실행하기 위한 가상머신으로, javac에 의해 번역된 .class파일을 불러와 실행시킨다.


JVM Structure

JVM은 총 다섯개의 컴포넌트로 이루어져있다.

  • Class Loader : JVM으로 class를 로드하고 링크를 통해 메모리에 배치함
  • Runtime Data Area : 운영체제에게 JVM이 할당받은 메모리 영역
  • Execution Engine : Runtime Data Area에 있는 바이트코드를 실행함
  • Native Method Interface : JVM에서 Native(C/C++, 어셈블리 등)코드를 실행하기 위한 인터페이스
  • Native Method Libraries : Native Method 실행에 필요한 라이브러리

JVM 작동 방식

  • 프로그램 실행 시 Class Loader가 필요한 class를 불러와 Runtime Data Area에 올리고, Execution EngineRuntime Data Area에 올라온 byte code를 실행한다. 이 과정에서 Native Method Interface를 통해 필요시 Native코드를 실행한다.

Class Loader

동적으로 클래스를 로딩해주는 역할을 하는 컴포넌트

  • 자바는 동적으로 클래스를 읽어오기 때문에 런타임에 모든 코드가 JVM과 연결된다.
  • Class Loader는 런타임에 .class 파일을 로드하여 JVM에 할당된 메모리영역인 Runtime Data Area로 올린다.
  • Class Loader의 자세한 구조와 동작은 Class Loader에 정리하였다.

Runtime Data Area

자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역

JVM의 Runtime Data Area는 쓰레드간 공유가능 여부에 따라 두 가지로 나뉜다.

  • 모든 쓰레드가 공유하는 영역
    • Method Area : 클래스 수준의 정보를 저장하는 영역
    • Heap : new 키워드로 생성된 인스턴스가 저장되는 영역
  • 쓰레드별로 하나씩 생성되는 영역
    • Stack : 지역변수, 파라미터 등 임시적으로 쓰이는 값들이 저장되는 영역
    • PC Register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역
    • Native Method Stack : Native코드를 실행할 때 사용되는 메모리영역
  • Runtime Data Area의 자세한 구조와 동작은 Runtime Data Area에 정리하였다.

Execution Engine

Runtime Data Area에 배치된 Byte Code를 실행시키는 컴포넌트

  • Interpreter : Byte Code를 명령어 단위로 읽어 기계어로 번역함
  • JIT Compiler : Interpreter의 효율을 높이기 위해 반복되는 코드를 한번에 기계어로 번역함
  • Garbage Collector : 더 이상 사용하지 않는 메모리를 자동으로 회수함
  • Execution Engine의 자세한 구조와 동작은 Execution Engine에 정리하였다.


참고자료

0개의 댓글