[Java] JVM 이란

Minsang Yu·2023년 4월 2일
0

Java는 어떠한 플랫폼에 영향을 받지않는다.

  • JVM은 Java가 어떠한 자바 프로그램 실행환경을 만들어주는 소프트웨어
  • Java 와 Os사이의 중재자 역할을 수행해 Java가 OS에 구애받지 않고 재사용 가능하게 도와준다.
  • Java는 플랫폼 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
  • 메모리 관리, Garbage Collection(GC를 통해 자원을 관리)을 수행한다.
  • 자바 바이트 코드를 실행하는 주체
  • 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함꼐 실행한다.
  • JVM을 사용하면 하나의 바이트코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다.

자바 실행과정
1. Java언어로 작성된 Test.java를 컴파일하면 Test.class파일이 생성된다.
2. 이렇게 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 자바 가상 머신이 운영체제에 맞는 실행파일로 바꿔준다.
3. Class Loader를 통해 Class파일을 JVM으로 로딩한다.
4. 로딩된 class파일들은 Execution Engine을 통해 해석된다.
5. 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어진다. 이러한 실행 과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리 작업을 수행한다.

  • C언어와 달리 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 따로따로 해줄 필요가 없다.

각각의 역할

  • Class Loader

    • Runtime시 JVM내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행
    • 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다.
    • .class파일을 묶어서 JVM이 운영체제로 부터 할당받은 메모리 영역인 Runtume Data Area로 적재한다.
    • 사용하지 않는 클래스들은 메모리에서 삭제한다.
  • Execution Engine

    • 클래스를 실행시키는 역할

    • class Loader가 Runtime Data Area에 배치한 바이트 코드를 Executuin Engine이 실행시킨다.

    • 자바 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 형태로 변경시키낟.

    • 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

      • Interpreter

        • 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
        • 한 줄씩 실행하기 떄문에 느리다.
      • JIT(Just-In-Time) Compiler

        • 인터프로티 방식의 단점을 보완하기 위해 등장
        • 인터프리터 방식으로 실행하다 적잘한 시점에 바이트 코드 전체를 컴파일 하여 네이티브 코드로 변경하고 이후에는 더 이상 인터프리리팅하지 않고 네이티브 코드로 직접 실행하는 방식
        • 네이티브 코드는 캐시에 보관하기 떄문에 한 번 컴파일된 코드는 빠르게 수행된다.
        • 한 번만 실행되는 코드는 JIT컴파일러가 컴파일 하는 거보다 인터프리터 방식이 더 유리하다.
        • 기존 인터프리터 방식보다 10~20 배정도 속도가 빠르다.
      • Garbage Collector

        • 더는 사용하지 않는 메모리를 자동으로 회수한다.
        • Heap 메모리 영역에 생성 된 객체들 중에 참조되지 않은 객체들을 탐색후 제거하는 역할
        • GC를 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지 상태가 된다.
      • Runtime Data Area

        • JVM이 프로그램을 수행하기 위해 OS로 부터 할당받은 메모리 공간

          			  *  **모든 스레드가 공유해서 사용 (GC의 대상)**
          • Heap Area
          • Method Area
        • 스레드 마다 하나씩 생성

          • Stack Area
          • PC Register
          • Native Method Stack
        • 힙 영역(Heap Area)

          • new 키워드로 생성된 객체와 배열이 생성되는 영역
          • 주기적으로 GC가 제가하는 영역

            * Heap Area 는 효율적인 GC를 위해 크게 3가지 영역으로 나뉜다.
            • Young Generation 영역은 자바 객체가 생성되자 마자 저장되고, 생긴지 얼마 안되는 객체가 저장됨
            • Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당된다.
            • 이 영역으로 데이터가 어느정도 쌓이면 참조 정도에 따라 Survivor의 빈 공간으로 이동되거나 회수된다.
            • Young Generation 영역이 차게되면 참조정도에 따라 Old 영역으로 이동되거나 회수된다.
            • Young Generation과 Tenured Generation 에서의 GCfmf Minor GC라고 한다.
            • old 영역에 할당된 메모리가 허용치를 넘게 되면 old 영역에 있는 모든 객체들을 검사해 참조되지 않는 객체들을 한꺼번에 삭제한다.
            • 이떄 GC를 수행하는 쓰레드를 제외하고 모두 멈추는데 이를 Stop-the-World 라 하고 old영역의 메모리를 회수하는 GC를 Major GC라고한다.

          • 스택 영역
            • 지역변수, 파라미터, 린턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
          • PC 레지스터
            • 스레드가 생성될 떄마다 생성되는 영역으로 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역
            • 네이티브 메서드 스택
              • 자바 이외의 네이티브 코드를 실행할 때 사용되는 메모리 영역으로 일반적으로 C 스택이 사용된다.
profile
Jr. DataEngineer

0개의 댓글