[Java(자바)] JVM(Java Virtual Machine)

2024. 5. 12. 07:35·Java/Java

JVM(Java Virtual Machine)

  • OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터
  • JVM이 인식할 수 있는 bytecode로 컴파일하는 과정 필요
    • 원시코드(*.java) -> Java bytecode(*.class) -> JVM -> 기계어(Binary Code)

구성

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • 가비지 콜렉터(Garbage collector)
  • 런타임 데이터 영역 (Runtime Data Area)

클래스 로더(Class Loader)

  • JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
  • 런타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재
  • 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할
  • 세 가지로 구분
    • 부트스트랩 클래스 로더, 플랫폼 클래스 로더, 시스템 클래스 로더
  • 계층 구조를 가지고 있음
    • 시스템 클래스 로더는 플랫폼 클래스 로더를 부모로 가지고
      플랫폼 클래스 로더는 부트스트랩 클래스 로더를 부모로 가짐

실행 엔진( Execution Engine )

  • 클래스를 실행시키는 역할
  • 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행
  • 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경

인터프리터( Interpreter )

  • 바이트코드 명령어를 하나씩 읽어서 해석하고 실행
  • 단점: 바이트코드 하나하나의 해석은 빠른 대신 인터프리팅 결과의 실행은 느림

JIT(Just-In-Time) 컴파일러

  • 인터프리터의 단점을 보완하기 위해 도입
  • 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고, 이후에는 해당 메서드를 더 이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식
  • 장점: 인터프리터 방식보다 빠르고, 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 계속 빠르게 수행가능

가비지 콜렉터(Garbage collector)

  • 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제

런타임 데이터 영역 (Runtime Data Area)

  • 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

PC Register

  • Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재
  • Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 가짐

Stack

  • 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역

Native Method Stack

  • 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역

Method Area (= Class Area = Static area)

  • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간

Heap

  • 객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장
저작자표시 비영리 변경금지 (새창열림)

'Java > Java' 카테고리의 다른 글

[Java(자바)] 오버라이딩과 오버로딩  (0) 2024.05.22
[Java(자바)] Stream(스트림)  (0) 2024.05.21
[Java(자바)] Java 21 - Virtual thread  (0) 2024.05.12
[Java(자바)] 자바의 Thread(쓰레드)  (0) 2024.05.12
[Java(자바)] 메모리 관리와 가비지 컬렉션  (0) 2024.05.12
'Java/Java' 카테고리의 다른 글
  • [Java(자바)] 오버라이딩과 오버로딩
  • [Java(자바)] Stream(스트림)
  • [Java(자바)] Java 21 - Virtual thread
  • [Java(자바)] 자바의 Thread(쓰레드)
주민1호
주민1호
개발/알고리즘 등등
  • 주민1호
    개발바라기별
    주민1호
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 🏚️
    • 🏷️
    • ✏️
    • ⚙️
    • All (40)
      • Data (0)
        • 💯DASP (0)
        • 💯SQLD (0)
        • 💯ADSP (0)
      • Java (17)
        • Java (11)
        • Spring Framework (6)
      • Python (0)
        • Python (0)
        • Flask (0)
        • TensorFlow (0)
      • JavaScript (1)
        • React (0)
        • Vue (0)
      • Lang (11)
        • C (11)
        • C++ (0)
      • Infra (0)
        • Docker (0)
        • Kubernetes (0)
        • AWS (0)
      • Algorithm (9)
      • 운영체제 (0)
        • Linux (0)
      • Etc. (1)
        • Git (1)
        • Network (0)
        • 컴퓨터과학개론 (0)
        • 멀티미디어시스템 (0)
      • AI (0)
      • Projects (0)
        • 2022 OSSCA (0)
      • Review (0)
      • 회고 (0)
  • hELLO· Designed By정상우.v4.10.3
주민1호
[Java(자바)] JVM(Java Virtual Machine)
상단으로

티스토리툴바