Java JVM 구조 이해 완벽 정리
Java를 제대로 이해하려면 반드시 알아야 하는 핵심이 바로:
JVM(Java Virtual Machine)
입니다.
특히 실무에서는:
- OutOfMemoryError
- GC 튜닝
- 서버 메모리 문제
- 성능 이슈
- Spring Boot 장애 분석
까지 JVM 이해가 매우 중요합니다.
초보 시절에는 보통:
Java 실행기
정도로만 이해하기 쉽지만,
실제로 JVM은:
- 클래스 로딩
- 메모리 관리
- 바이트코드 실행
- JIT 최적화
- GC 수행
까지 담당하는 거대한 런타임 시스템입니다.
1. JVM이 왜 필요한가?
Java 핵심 철학:
Write Once, Run Anywhere
즉:
- Windows
- Linux
- Mac
어디서든 동일 코드 실행 가능.
2. Java 실행 전체 흐름
전체 구조를 먼저 보면:
.java 파일
↓
javac 컴파일
↓
.class(ByteCode)
↓
JVM 실행
↓
OS / CPU 위에서 동작
3. javac란?
Java 컴파일러.
예시:
javac Main.java
설명:
| 요소 | 의미 |
| javac | Java compiler |
| Main.java | 컴파일 대상 파일 |
결과:
Main.class
파일 생성.
4. .class 파일이란?
ByteCode
파일.
특징:
- 기계어(X)
- JVM용 중간 코드(O)
즉:
운영체제 독립적
입니다.
5. JVM 전체 구조
JVM 핵심 구성 요소:
ClassLoader
Runtime Data Area
Execution Engine
Garbage Collector
JNI
Native Method Library
6. JVM 전체 그림
가장 중요한 전체 흐름:
.class 파일
↓
ClassLoader
↓
Runtime Memory 적재
↓
Execution Engine 실행
↓
GC 메모리 관리
7. ClassLoader란?
ClassLoader는:
.class 파일을 읽어서 JVM 메모리에 올리는 역할
입니다.
즉:
파일 읽기
↓
클래스 정보 생성
↓
메모리 적재
수행.
8. ClassLoader 동작 단계
순서:
Loading
↓
Linking
↓
Initialization
9. Loading
.class 파일 읽기
단계.
10. Linking
3단계 존재.
| 단계 | 설명 |
| Verification | 바이트코드 검증 |
| Preparation | static 메모리 준비 |
| Resolution | 참조 연결 |
11. Initialization
static 변수 초기화
static block 실행
수행.
12. Runtime Data Area란?
JVM 메모리 영역.
가장 중요합니다.
대표 영역:
Heap
Stack
Method Area
PC Register
Native Method Stack
13. Heap 영역
Heap은:
객체(Object)가 저장되는 영역
입니다.
예시:
User user = new User();
여기서:
new User()
객체는 Heap에 생성.
14. Heap 특징
| 특징 | 설명 |
| 모든 스레드 공유 | O |
| 객체 저장 | O |
| GC 대상 | O |
15. Heap 메모리 그림
Stack:
user -> 0x1000
Heap:
0x1000 -> User 객체
즉:
- 변수는 Stack
- 실제 객체는 Heap
16. Stack 영역
Stack은:
메서드 실행 정보 저장 영역
입니다.
저장 내용:
- 지역 변수
- 매개변수
- 메서드 호출 정보
17. Stack 특징
| 특징 | 설명 |
| 스레드별 생성 | O |
| 메서드 종료 시 제거 | O |
| 매우 빠름 | O |
18. Stack Frame
메서드 호출 시:
Stack Frame
생성.
예시:
void test() {
int x = 10;
}
호출 시:
Stack Frame 생성
종료 시 제거.
19. StackOverflowError
대표 사례:
void recursive() {
recursive();
}
무한 재귀 발생 시:
Stack 공간 초과
발생.
20. Method Area
Method Area는:
클래스 메타데이터 저장 영역
입니다.
저장 내용:
- 클래스 정보
- 메서드 정보
- static 변수
- Constant Pool
21. static 변수는 어디 저장될까?
예시:
static int count;
→ Method Area 계열 저장.
22. String Pool
String s = "Java";
문자열 리터럴도 JVM 내부 Pool 구조 사용.
Method Area 계열과 연결.
23. PC Register
현재 실행 중인 JVM 명령 위치 저장.
즉:
현재 어느 ByteCode 실행 중인가
추적.
24. Native Method Stack
Java 외부 Native 코드 실행 영역.
예:
C/C++
OS API
연동.
25. Execution Engine
Execution Engine은:
ByteCode를 실제 실행하는 엔진
입니다.
26. 실행 방식 2가지
| 방식 | 설명 |
| Interpreter | 한 줄씩 해석 |
| JIT Compiler | 기계어 최적화 |
27. Interpreter 방식
초기 Java 방식.
ByteCode 한 줄씩 해석 실행
장점:
- 빠른 시작
단점:
- 반복 실행 느림
28. JIT Compiler란?
HotSpot JVM 핵심 기술.
JIT:
자주 실행되는 코드를 기계어로 변환
합니다.
즉:
반복 코드 탐지
↓
Native Code 변환
↓
CPU 직접 실행
29. Java가 생각보다 빠른 이유
많은 사람들이:
Java는 느리다
생각하지만 실제로는:
JIT 최적화
덕분에 매우 빠른 경우 많음.
30. Garbage Collector(GC)
GC는:
사용하지 않는 객체 자동 제거
기능.
즉:
참조 없는 객체 탐색
↓
Heap 메모리 회수
31. GC가 필요한 이유
C/C++:
직접 free()
필요.
Java:
GC 자동 메모리 관리
가능.
32. JNI(Java Native Interface)
JNI는:
Java와 Native 코드 연결 기술
입니다.
즉:
Java ↔ C/C++
연동 가능.
33. JVM 메모리 전체 흐름
전체 구조:
ClassLoader
↓
Method Area 클래스 적재
↓
Heap 객체 생성
↓
Stack 메서드 실행
↓
Execution Engine 실행
↓
GC 메모리 정리
34. Heap vs Stack 핵심 차이
| 구분 | Heap | Stack |
| 저장 | 객체 | 지역 변수 |
| 공유 | 전체 스레드 | 스레드별 |
| 속도 | 상대적으로 느림 | 매우 빠름 |
| GC 대상 | O | X |
35. 실무에서 JVM 이해가 중요한 이유
대표 사례:
| 문제 | JVM 연결 |
| OutOfMemoryError | Heap 부족 |
| StackOverflowError | Stack 초과 |
| GC 지연 | Heap 문제 |
| 서버 성능 저하 | JIT/GC |
36. OutOfMemoryError 예시
객체 계속 생성
↓
Heap 부족
↓
OOM 발생
37. JVM 옵션 예시
대표 옵션:
java -Xms512m -Xmx2g
설명:
| 옵션 | 의미 |
| -Xms | 초기 Heap 크기 |
| -Xmx | 최대 Heap 크기 |
38. 실무에서 자주 하는 실수
1) Heap과 Stack 혼동
매우 흔함.
2) 객체 생성 비용 무시
객체 너무 많이 만들면:
GC 부담 증가
가능.
3) static 메모리 위치 이해 부족
static은 객체가 아니라:
클래스 영역
기반.
39. JVM 구조 핵심 요약
ClassLoader
= 클래스 적재
Heap
= 객체 저장
Stack
= 메서드 실행
Execution Engine
= ByteCode 실행
GC
= 메모리 회수
40. 정리
JVM(Java Virtual Machine)은 단순 실행기가 아닙니다.
실제로는:
- 클래스 로딩
- 메모리 관리
- 바이트코드 실행
- GC
- JIT 최적화
를 담당하는 Java 핵심 런타임 시스템입니다.
특히 실무에서는:
- Heap/Stack 구조
- GC 동작
- JIT Compiler
- ClassLoader
를 이해하는 것이 매우 중요합니다.
다음 글에서는:
ClassLoader 동작 원리
를 Parent Delegation Model, Bootstrap ClassLoader, Spring Boot Fat Jar 구조까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java Stack / Heap / Method Area 메모리 구조 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java ClassLoader 동작 원리 완벽 이해하기 (0) | 2026.05.26 |
| Java 템플릿 메서드 패턴(Template Method Pattern) 완벽 이해하기 (0) | 2026.05.22 |
| Java 전략 패턴(Strategy Pattern) 완벽 이해하기 (0) | 2026.05.22 |
| Java Builder Pattern 완벽 이해하기 (0) | 2026.05.22 |
댓글