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