15. JVM 아키텍처(JVM Architecture)

박은서's avatar
Dec 17, 2025
15. JVM 아키텍처(JVM Architecture)

1. JVM(Java Virtual Machine)

1️⃣ JVM이란?

자바 바이트코드를 실행하는 가상 머신

2️⃣ JVM의 역할

  • OS 독립성 제공
  • 메모리 관리
  • 바이트코드 실행
  • GC 수행
 

2. JVM 아키텍처(JVM Architecture)

1️⃣ JVM 아키텍처란?

1) JVM 아키텍처의 개념

Java 프로그램을 실행하기 위해 JVM이 내부적으로 어떻게 구성되어 있고, 어떤 방식으로 작동하는지를 나타낸 구조
→ 자바 코드를 실행하기 위한 “가상 컴퓨터”의 내부 구조

2) JVM 전체 구조

Java Source (.java) ↓ Compiler (javac) ↓ Bytecode (.class) ↓ ┌──────────────── JVM ────────────────┐ │ Class Loader │ │ Runtime Data Areas (Memory) │ │ Execution Engine │ │ Garbage Collector │ └─────────────────────────────────────┘
notion image

2️⃣ JVM 아키텍처

1) Class Loader(클래스 로더)

자바 프로그램을 실행하기 위해 **.class 파일(바이트코드)**을 JVM 내부로 불러오는 시스템
주요 역할
  1. Loading
      • 클래스 파일 읽기
  1. Linking
      • Verify (검증)
      • Prepare (메모리 할당)
      • Resolve (참조 연결)
  1. Initialization
      • static 변수 초기화
      • static 블록 실행
📌 한 번만 수행

2) Runtime Data Area(실행 시 데이터 영역)

JVM 실행 중 필요한 데이터를 보관하는 메모리 구조
① Method Area (메타데이터 영역)
  • 클래스 정보
  • static 변수
  • 메서드 정보
  • 상수 풀
📌 모든 스레드 공유
② Heap 영역
  • 객체(Object), 인스턴스
  • new로 생성된 모든 것
📌 모든 스레드 공유
📌 GC 관리 대상
③ Stack (Java Stack) 영역
  • 메서드 호출 정보
  • 지역 변수
  • 매개변수
📌 스레드마다 독립
📌 메서드 종료 시 자동 제거
④ PC Register
  • 현재 실행 중인 명령어 주소
📌 스레드마다 존재
⑤ Native Method Stack
  • C/C++ 같은 네이티브 메서드 호출 시 사용

3) Execution Engine(실행 엔진)

바이트코드를 실제로 실행하는 장치
실제 JVM 성능의 핵심
① Interpreter(인터프리터)
  • 바이트코드를 한 줄씩 해석하며 실행
  • 느림
② JIT Compiler(Just-In-Time Compiler)
  • 자주 실행되는 코드를 기계어로 컴파일하여 속도 향상
③ Garbage Collector
  • 더 이상 사용되지 않는 객체 메모리 자동 회수

3️⃣ JVM 실행 흐름 요약

  • .java 컴파일 → .class
  • Class Loader 로딩
  • Method Area에 클래스 정보 저장
  • Heap에 객체 생성
  • Stack에 메서드 호출
  • Execution Engine 실행
  • GC 메모리 정리
 

3. 스택(Stack)과 큐(Queue)

1️⃣ 스택(Stack)

1) 스택이란?

데이터를 넣고 꺼내는 순서를 제한하는 자료구조
가장 나중에 들어온 데이터가 가장 먼저 나가는 후입선출(LIFO: Last In, First Out)

2) 스택의 기본 구조

┌───┐ ←Top │ 3 │ │ 2 │ │ 1 │ └───┘
  • Top: 가장 위의 데이터
  • 삽입과 삭제는 Top에서만 이루어짐

3) 스택의 기본 연산

연산
설명
push
데이터 넣기
pop
데이터 꺼내기
peek/top
맨 위 확인
isEmpty
비어있는지

2️⃣ 큐(Queue)

1) 큐란?

선입선출(FIFO, First In First Out) 구조의 자료구조
📌 줄 서기와 같은 구조

2) 큐의 기본 구조

Front →[ 1 ][ 2 ][ 3 ] → Rear
  • Front : 삭제 위치
  • Rear : 삽입 위치

3) 큐의 기본 연산

연산
설명
offer / add
데이터 삽입
poll / remove
데이터 삭제
peek / element
맨 앞 확인
isEmpty
비어있는지

3️⃣ 스택(Stack) vs 큐(Queue)

구분
Stack
Queue
구조
LIFO
FIFO
사용
되돌리기
대기열

4️⃣ 실습

package jvm; public class Stack01 { static void m1(int a){ int b = 10; int sum = a+b; System.out.println("sum : " + sum); } static void m2(){ System.out.println(1); System.out.println(2); System.out.println(3); } static void m3(){ System.out.println("m3 호출됨"); int num = 1; m3(); // 재귀호출 -> 무한 반복 -> stackoverflow -> 데몬 } public static void main(String[] args) { System.out.println("main 시작"); m1(5); m2(); System.out.println("main 끝"); } }
notion image

5️⃣ 필기 정리

notion image
 

4. Heap

1️⃣ Heap이란?

객체(Object)와 인스턴스가 저장되는 JVM 메모리 공간
프로그램 실행 중에 필요한 만큼 메모리를 자유롭게 할당·반환하는 영역
동적 메모리(dynamic memory)라고도 불림

2️⃣ Heap에 저장되는 것

✔️ 객체
✔ 배열
✔ 인스턴스 변수
❌ 지역 변수
❌ 메서드 호출 정보

3️⃣실습

package jvm; class Student { int no; // 메모리에 뜨면 Heap에 뜰 것! static이 안붙어 있으니까! String name; int age; static String school = "그린아카데미"; void setNo(int no){ this.no = no; // 그냥 no는 setNo스택에 있는 no / this.가 붙으면 setNo 호출되는 Heap에 있는 no 호출 } // 책임 : 상태 확인 void show(){ System.out.println(no); System.out.println(name); System.out.println(age); System.out.println(school); System.out.println(); } } public class Heap01 { static int num = 10; public static void main(String[] args) { Student s1 = new Student(); s1.no = 1; s1.name = "홍길동"; s1.age = 20; s1.show(); Student s2 = new Student(); s2.no = 2; s2.name = "장보고"; s2.age = 20; s2.show(); s2.setNo(5); // 장보고 번호 변경 s2.show(); System.out.println(Heap01.num); } }
notion image

4️⃣ 필기 정리

notion image
Share article