Java_003 (20250502)
| 영역 | 정의 | JVM 구성 요소 |
|---|---|---|
| 메소드 영역 | 클래스, 메서드, static 변수 등의 설계 정보 저장 공간 | 공유 메모리 |
| 힙 영역 | new로 생성된 객체와 그 인스턴스 변수들 저장 공간 |
공유 메모리 |
| 스택 영역 | 각 스레드별 메서드 호출 정보, 지역 변수 저장 공간 | 스레드 전용 메모리 |
| PC 레지스터, 네이티브 메소드 스택 등 | 스레드 제어용 내부 구조 | 고급 주제에서 다룸 |
🏢 건물(=메모리/RAM) 안에는
- 🗃️ 힙: 모든 직원이 공유하는 창고
- 📚 메소드 영역: 매뉴얼, 규칙서가 모인 공간
- 🗂️ 스택: 각 직원이 개인 책상에 펼쳐놓은 서류
🧑💻 직원 = 스레드
- 일할 때마다 **개인 책상(스택)**을 사용
- 공용 창고(힙)와 매뉴얼(메소드 영역)은 함께 봄
| 항목 | 메소드 영역 | 힙 영역 | 스택 영역 |
|---|---|---|---|
| 소속 | 공유 | 공유 | 스레드 전용 |
| 저장 대상 | 클래스, static | 객체, 인스턴스 변수 | 메서드 호출 정보, 지역 변수 |
| 생성 시점 | 클래스 로딩 시 | new 연산 시 | 스레드 시작 시 |
| 소멸 시점 | JVM 종료 시 | GC 대상 | 메서드 종료 시 pop |
| 한계 상황 | 오류 | 원인 |
|---|---|---|
| 스택이 꽉 찼을 때 | StackOverflowError |
재귀 무한 호출, 메서드 과도한 호출 |
| 힙이 꽉 찼을 때 | OutOfMemoryError |
객체 과다 생성, GC 불능 상태 |
| 코드 | 메모리 영향 |
|---|---|
Person 클래스 정의 |
메소드 영역에 저장 |
new Person() |
힙에 객체 저장 |
p 변수 |
스택 영역에 저장 (참조 변수) |
p.name = "Alice" |
힙에 있는 객체의 필드 값 변경 |