JVM의 개념과 내부 구조 정리

2025. 6. 19. 15:23·TIL (Today I Learned)

JVM (Java Virtual Machine)

JVM은 `.java` 소스파일(=원시코드)을 컴파일한 결과물인 `.class` 파일(=바이트코드)을 읽어서,

운영체제와 하드웨어에 맞게 실행할 수 있도록 해주는 가상 머신입니다.

Java는 운영체제(OS)에 종속적이지 않다는 특징이 JVM에 의해서 동작됩니다.

JVM 덕분에 자바는 한 번 작성한 코드를 윈도우, 리눅스, 맥 등 다양한 환경에서 같은 코드로 실행할 수 있습니다.

 

JVM의 주요 역할

역할 설명
바이트코드 실행 컴파일된 `.class` 파일을 읽고 실행
메모리 관리 객체 생성/삭제,
스택/힙 등 메모리 구조를 관리
GC (Garbage Collection) 사용하지 않는 객체를 자동으로 정리해 메모리 누수를 방지
운영체제 독립성 보장 동일한 바이트 코드를 OS에 상관없이 실행할 수 있게 함
보안 및 예외 처리 클래스 로딩과 실행 시 보안 검사를 수행하고 예외 상황을 처리

 

Java 코드 실행 단계별 용어

용어 설명
원시 코드 (원시 프로그램)
= 소스 코드 (source code)
사람이 작성한 컴파일 전 코드 (`.java`)
바이트코드 (bytecode) 자바 컴파일러가 생성한 JVM용 중간 코드 (`.class`)
기계어 (machine code) CPU가 직접 이해하는 2진수 코드(바이너리 코드)
(JVM은 이걸 대신 실행해줌)

 


JVM의 구성 요소

  • `Java Compiler(javac)`는 소스 코드를 `.class` 파일로 컴파일
  • 이후 `Class Loader`가 클래스 파일을 JVM 메모리로 로딩
  • `Execution Engine`은 인터프리터 또는 JIT 컴파일러를 통해 바이트코드를 기계어로 변환하여 실행
  • `Garbage Collector`는 힙 메모리 영역에서 사용하지 않는 객체를 정리

 

1. Class Loader

  • `.class` 파일을 메모리로 로딩하여 JVM 내부에서 사용할 수 있도록 함
  • 로딩 → 검증 → 준비 → 분석 → 초기화 단계로 동작
    • 자바 클래스 파일을 메모리에 로딩한 뒤, 
    • JVM이 실행할 수 있도록 연결(Linking)과 초기화(Initialization) 작업을 수행

 

2. 메모리 구조 (Runtime Data Area)

JVM은 실행 시 메모리를 여러 영역으로 나누어 관리합니다.

  • `PC 레지스터`, `JVM Stack`, `Native Method Stack`은 스레드마다 별도로 생성
영역 설명
Program Counter (PC) Register 현재 실행 중인 바이트코드 명령의 주소를 저장
JVM Stack 메서드 호출 시 생성되는 스택 프레임 저장
지역 변수, 연산 중간 결과 등을 포함
Native Method Stack 네이티브 코드를 실행할 때 사용하는 스택
❓ Native Code
운영체제에서 바로 실행할 수 있는 기계어 코드 (C/C++ 기반 코드)

 

  • `Heap`, `Method Area`, `Runtime Constant Pool`은 모든 스레드가 공유하는 영역
영역 설명
Heap 객체 인스턴스 저장 공간
GC의 주요 대상이며 모든 스레드가 접근
Method Area (= Class Area = Static Area) 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
클래스 정보, 메서드, static 변수 등 공통 데이터 저장
Runtime Constant Pool 상수와 메서드/필드 참조 정보를 저장하는 공간
Method Area 내부에 포함됨

 

3. 실행 엔진 (Execution Engine)

바이트코드를 실제 기계어로 변환해 실행하는 역할:

  • 인터프리터
    • 자바 바이트 코드를 명령어 단위로 읽어서 실행
    • 한 줄씩 해석 -> 느림
  • JIT (Just-In-Time)
    • 반복적으로 실행되는 메서드(핫스팟)를 감지해 바이트코드를 기계어로 변환하고,
    • 이후에는 해당 부분을 인터프리팅 없이 직접 실행
    • -> 성능 최적화

 

4. GC (Garbage Collector)

Heap에 존재하는 사용하지 않는 객체를 자동으로 수거

 


JVM과 JRE, JDK의 차이

구성 요소 설명
JVM (Java Virtual Machine) 바이트코드를 해석하고 실행하는 가상 머신
JRE (Java Runtime Enviroment) JVM + 실행에 필요한 라이브러리 패키지(`.jar`)
JDK (Java Development Kit) JRE + 개발 도구(`javac`, `javadoc`, `jarsigner` 등) 
JDK ⊃ JRE ⊃ JVM

 

 

참고: https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80

저작자표시 비영리 변경금지 (새창열림)

'TIL (Today I Learned)' 카테고리의 다른 글

DB 개념 정리 🧠 | 정규화/반정규화, 인덱스, 트랜잭션, JOIN  (1) 2025.06.26
Spring Boot 면접 대비 개념 정리❕  (1) 2025.06.19
Synchronous 🆚 Asynchronous | RabbitMQ 기반 비동기 처리 구조  (2) 2025.06.05
JWT 인증 기반 WebSocket 연결 실패, 원인과 해결법  (2) 2025.06.05
Spring Boot 설정값 바인딩 정리: @Value vs @ConfigurationProperties  (2) 2025.05.24
'TIL (Today I Learned)' 카테고리의 다른 글
  • DB 개념 정리 🧠 | 정규화/반정규화, 인덱스, 트랜잭션, JOIN
  • Spring Boot 면접 대비 개념 정리❕
  • Synchronous 🆚 Asynchronous | RabbitMQ 기반 비동기 처리 구조
  • JWT 인증 기반 WebSocket 연결 실패, 원인과 해결법
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    mysql
    BOJ
    java
    greedy
    programmers
    HTML
    sql
    프로그래머스
    join
    시뮬레이션
    dp
    자료구조
    bootstrap
    BFS
    jwt
    websocket
    그리디
    jpa
    Subquery
    다이나믹프로그래밍
    백트래킹
    jQuery
    CSS
    DFS
    Google Fonts
    javascript
    Firebase
    완전탐색
    백준
    GROUP BY
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
JVM의 개념과 내부 구조 정리
상단으로

티스토리툴바