[퍼비톡] JVM

Song Chae Won·2023년 9월 19일

퍼비톡

목록 보기
6/10
post-thumbnail

EFUB 퍼비톡 자료로, 모든 사진의 출처는 EFUB 퍼비톡 입니다.

JVM의 등장 배경

문제) 호스트 머신과 타켓 머신의 플랫폼이 다른 경우, 프로그램 실행이 불가능
해결) 자바 바이트코드는 JVM 위에서 동작한다. ➡️ JVM만 있다면 어디서든 실행할 수 있다.

JVM

Java virtual machine (JVM) 은 자바 프로그램, 그리고 자바 바이트코드로 컴파일된 프로그램을 실행할 수 있게 하는 가상 머신이다.

JDK Architecture

JDK : 자바 프로그램 개발을 위한 도구를 포함하고 있는 구성요소. 자바 프로그램을 JRE, JVM에서 실행 가능하도록 변환해주는 역할

JRE: 코드를 실행하기 위한 JVM, JVM에 필요한 클래스 라이브러리와 여러 파일이 포함되어 있는 구성요소

JVM: 코드 실행을 위한 런타임 환경을 제공하는 구성요소. 바이트코드를 플랫폼에 맞는 기계어로 번역하고 실행

JVM 내부 구조
1. Class Loader Subsystem
2. Runtime Data Areas
3. Execution Engine

Class Loader Subsystem

동적 로딩을 통해 필요한 클래스들을 로딩, 링크, 초기화하여 메모리(Runtime Data Area)에 올린다.
1. Loading
• 클래스 로더가 .class 파일을 읽고 메모리에 로드하는 단계
• 이때 시점은 컴파일 타임이 아닌 런타임에 처음으로 해당 클래스를 참조하는 시점

  1. Linking
    • Verify: class 파일의 형식이 올바른지 검사하는 단계
    • Prepare: 클래스의 정적 변수에 메모리를 할당하고, 메모리를 기본값으로 초기화하는 단계
    • Resolve: 필드나 메소드에 대한 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경하는 단계
  2. Initialization
  • static variable에 정의된 값을 할당한다.
  • static block을 실행한다.

JVM의 구조

  1. Class Loader Subsystem
  2. Runtime Data Areas
  3. Execution Engine

Runtime Data Areas

  1. Method Area
    • 로딩한 바이트코드(.class)를 저장하기 위한 공간
    • Class-level 데이터를 저장
    (ex: 클래스의 구조, 정적 필드)

  2. Heap Area
    • 객체를 저장하기 위한 공간
    • 인스턴스 변수, 배열 등 Reference Type을 저장
    • 가비지 콜렉터의 대상

  3. Stack Area
    • 메소드 호출에 필요한 데이터를 저장하기 위한 공간
    • 메소드를 호출할 때마다 새 Stack Frame을 생성하고, 호출이 완료되면 삭제

  4. PC Registers
    • 현재 실행 중인 명령어 주소를 가리키는 레지스터

  5. Native Method Stack
    • 네이티브 코드 실행을 위한 스택
    • 기계어로 컴파일된 코드, C/C++로 작성된 코드 등
    실행할 때 사용

Execution Engine

  1. Interpreter
    바이트코드 명령어를 하나씩 읽고 실행

  2. JIT Compiler
    바이트코드 전체를 네이티브 코드로 컴파일하여 캐싱해 두었다가 실행

  3. Garbage Collection (Garbage Collector)
    JVM의 Heap area에서 더 이상 참조되지 않는 객체를 제거

profile
@chhaewxn

0개의 댓글