[Java] JVM

gyeol·2025년 9월 23일

자바

목록 보기
15/24
post-thumbnail

JVM(Java Virtual Machine)

운영체제에 종속받지 않고 CPU가 Java 인식하고 실행할 수 있도록 해주는 가상 컴퓨터이다.
→ 이 덕분에 자바는 운영체제에 독립적이라는 장점을 가지게 된다.

자바 언어 자체는 CPU가 인식하지 못하기에 기계어로 컴파일을 해줘야 하는데 이때 Java는 byte코드로 변환된 후 JVM이 binary code로 변환된다.

  • Java 작성한 소스파일은 JVM을 거쳐 운영체제와 상호작용 함
  • JVM 덕분에 Java는 “운영체제로부터 독립적”라는 특징을 가짐 (Write Once, Run Anywhere)

구조

Class Loader

클래스 파일(.class)을 로드하고 링크를 통해 배치하는 작업 수행한다. 런타임 시, 동적으로 클래스 로드하고 jar 파일 내 저장된 클래스들을 JVM 런타임 데이터 영역에 로드한다.

동적으로 로드?
시작시 한 번에 다 올리는게 아니라 필요할 때마다 로드

  • Loading
    • 자바 컴파일러가 생성한 바이트 코드를 읽어와 JVM 메모리에 저장
    • 읽어온 바이트코드 내용을 분석해 클래스에 대한 정보를 Method Area에 저장
  • Linking
    • 로드된 클래스 파일의 내용을 검증하고 필요한 메모리를 할당하며 실제 메모리 주소로 교체
    • 메모리를 할당할 때 우리가 아는 기본값으로 초기화(int=0, boolean=false …)
  • Initialization
    • 클래스 변수(static 변수)들을 개발자가 코드에 명시한 값으로 최종 초기화함
    • 클래스에 정의된 static 블록들을 이 단계에서 실행

Execution Engine

Class Loader가 가져온 바이트 코드를 해석하고 실행한다.

  • Interpreter
    • 자바 바이트 코드를 명령어 단위로 읽어서 수행
    • 속도는 느리지만 수정 시 즉각적인 반응 확인 가능
      (매번 한 줄씩 해석)
  • Just-in-Time
    • 인터프리터가 코드를 실행하다가 자주 반복되는 부분(HotSpot)을 발견하면 그 부분 전체를 런타임에 해당 시스템에 최적화된 기계어(네이티브 코드)로 컴파일함
      → 컴파일된 네이티브 코드는 캐시에 저장해두고 다음부터는 인터프리터를 거치지 않고 바로 사용
  • Garbage collector
    • 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
      (Heap 영역에서)

Runtime Data Area

JVM이 프로그램을 실행하며 사용하는 메모리 공간이다. 즉, 운영체제로부터 할당받은 메모리 영역 의미한다.

  • Method Area
    • 클래스 수준의 정보와 static 변수, 상수등이 저장
    • 모든 스레드가 공유
  • Heap Area
    • new 키워드로 생성된 인스턴스와 배열이 저장되는 공간
    • 가비지 컬렉션의 주된 대상
    • 모든 스레드가 공유
  • Stack Area
    • 메서드 호출 시마다 메서드의 정보를 담는 스택 프레임이 생성되어 저장됨
    • 스레드마다 별도의 스택 할당 → 메서드 호출 끝나면 자동 제거
  • PC Registers
    • 각 스레드는 현재 실행중인 JVM 명령어의 주소를 저장하는 PC 레지스터를 가짐
  • Native Method Stack
    • 자바 외의 언어로 작성된 코드 실행 시 사용되는 메모리 영역
profile
공부 기록 공간 '◡'

0개의 댓글