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 │
└─────────────────────────────────────┘

2️⃣ JVM 아키텍처
1) Class Loader(클래스 로더)
자바 프로그램을 실행하기 위해 **.class 파일(바이트코드)**을 JVM 내부로 불러오는 시스템
주요 역할
- Loading
- 클래스 파일 읽기
- Linking
- Verify (검증)
- Prepare (메모리 할당)
- Resolve (참조 연결)
- 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 끝");
}
}
5️⃣ 필기 정리

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);
}
}
4️⃣ 필기 정리

Share article