[CS][Java] JVM 구조

손경이·2024년 4월 30일
0

CS Study

목록 보기
20/25

JVM 구조


크게 Class Loader, Runtime Data Area, Execution Engine, GC(Garbage Collector)로 나누어 집니다.

  • Class Loader : 소스코드에서 컴파일한 '자바 바이트코드'인 .class 파일을 JVM 메모리 영역(Runtime Data Area)에 적재
  • Runtime Data Area(JVM 메모리 영역) : 자바애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
  • Execution Engine : Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행
  • GC(Garbage Collector) : Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할

JVM 참고하기


> JVM 구조

  • Class Loader
    • .java 파일을 javac 컴파일러로 컴파일 하게 되면 .class 파일인 바이트 코드가 생김
    • 이렇게 생성된 클래스 파일들을 엮어서 JVM으로 부터 할당받은 메모리 영역인 Runtime Data Area로 각각 적재 하는 역할
  • Execution Engine
    • Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행
    • 명령어를 하나하나 실행하는 인터프리터 방식이 있고
    • JIT 컴파일러를 이용하는 방식이 있음
      • JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Excution engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식
  • Runtime Data Area
    • JVM의 메모리 영역으로 자바애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
    • 실행 시 클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳
  • Garbage Collector(GC)
    • Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할
    • GC는 언제 일어날지 모르며, GC가 수행하는 동안 다른 모드 쓰레드가 일시정지하는 STW(Stop the World)가 발생

> Runtime Data Area(JVM 메모리 영역)

Method Area와 Heap은 모든 쓰레드가 공유하는 영역

  • 따라서 멀티 쓰레드 프로그래밍을 할 때 동기화에 주의해야하는 영역
  • Method Area
    • 클래스에 대한 정보가 저장되는 영역
    • 클래스 정보를 처음 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 영역
    • 올라가는 정보
      • Field Information
        • 멤버 변수에 대한 정보(이름, 타입, 접근 제어자 등)
      • Method Information
        • 메서드에 대한 정보(이름, 리턴 타입, 파라미터, 접근 제어자 등)
      • Type Information
        • Class인지 Interface인지, Type 속성, 이름, super class 이름 등
      • 상수형을 저장하고 중복을 막는 Runtime Constant Poll이 존재
      • static 변수, final Class 변수 등
  • Heap
    • 객체를 동적으로 생성하게 되면 인스턴스가 Heap 영역의 메모리에 할당
      • new 연산으로 생성된 객체와 배열이 저장되는 영역
    • 메서드 영역에 로드된 클래스만 생성이 가능
    • GC가 참조되지 않는 메모리를 확인하고 제거하는 역할

      예시) Person p = new Person("사용자", 29);

      • 변수 p는 Stack 영역에 저장되고 동적으로 생성한 객체 Person("사용자",29)는 Heap 영역에 저장됨
      • 기본 타입이 아닌 참조 타입인 경우 Stack 영역이 아닌 Heap 영역에 메모리 저장
      • 그 메모리에 주소를 참조하는 변수를 Stack 영역에 저장

Stack과 PC Registers와 Native Method Stacks는쓰레드마다 하나씩 생성되는 공간

  • Java Stack
    • 메서드를 실행하기 위한 정보가 저장되는 영역
      • 지역변수, 파라미터, 리턴값 연산에 사용되는 임시 값 등이 저장되는 영역
    • Java Stack 안에 frame이라는 자료구조가 들어감
    • frame은 메서드가 하나 호출될 때마다 새로 생기고 메서드가 끝나거나 에외가 터지면 사라짐
  • PC Registers
    • 쓰레드가 생성될 때마다 생성되는 영역
    • JVM은 스택 기반의 가상 머신으로, CPU에 직접 접근하지 않고 Stack에서 주소를 뽑아서 가져옴
      • 가져온 주소는 PC Register에 저장됨
    • 현재 어떤 명령을 실행해야 할 지에 대한 기록 담당
    • Program Counter로, CPU에 있는 레지스터와 다름
    • 자바 프로그래밍 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행 시키는 영역
  • Native Method Stacks
    • 자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역
    • 자바외 언어에 제공되는 메서드의 정보가 저장되는 공간
      • Java Native Interface를 통해 바이트 코드로 저장
    • Kernel이 자체적으로 Stack을 잡아 독자적으로 프로그램을 실행시키는 영역

참고

0개의 댓글