[Java] JVM(Java Virtual Machine)

2025. 9. 24. 16:50·Development & Projects/Java

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
    • 자바 외의 언어로 작성된 코드 실행 시 사용되는 메모리 영역

'Development & Projects > Java' 카테고리의 다른 글

[Spring] 스프링 빈이란? / Spring Bean / 등록 방법 / 빈 스코프 / LifeCycle  (0) 2025.09.30
[Java] 비동기 처리와 스레드 관리  (0) 2025.09.27
[Java] 상속 정리 / 다중 상속 / 다이아몬드 문제  (0) 2025.09.21
[Java] 추상 클래스와 인터페이스 정리  (0) 2025.09.20
[Java] 자바 컴파일 과정  (0) 2025.06.28
'Development & Projects/Java' 카테고리의 다른 글
  • [Spring] 스프링 빈이란? / Spring Bean / 등록 방법 / 빈 스코프 / LifeCycle
  • [Java] 비동기 처리와 스레드 관리
  • [Java] 상속 정리 / 다중 상속 / 다이아몬드 문제
  • [Java] 추상 클래스와 인터페이스 정리
seulll
seulll
개인 공부 블로그입니다.
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
  • Seuli's Github
    • 분류 전체보기 (398)
      • Coding Test (260)
        • Programmers (164)
        • Baekjoon (94)
      • Data Structures & Algorithm.. (15)
      • Development & Projects (59)
        • Python (5)
        • Java (15)
        • Android (5)
        • AI (6)
        • Unity (3)
        • API (5)
      • OS (5)
      • DB | SQL (7)
      • Network (8)
      • Data Analysis (14)
      • Study | etc (21)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 공지사항

  • 인기 글

  • 태그

    Greedy
    티스토리챌린지
    kakao map api
    백엔드
    웹크롤링
    박스플롯
    오차행렬
    train_test_split
    2 x n 타일링
    Python
    solving environment
    바다코끼리
    코딩테스트
    카카오맵 api
    오블완
    모델 성능 평가
    프로그래머스
    API
    데이터분석
    프렌즈4블록
    대입 표현식
    야근 지수
    백엔드 개발자 역량
    백엔드 개발자
    파이썬
    Boxplot
    카카오맵
    asterisk
    confusion matrix
    그리디 알고리즘
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
seulll
[Java] JVM(Java Virtual Machine)
상단으로

티스토리툴바