자바 프로그램이 실행될 때 JVM(Java Virtual Machine)이 메모리를 크게 4개 영역으로 나눠 관리합니다.

출처 : https://blog.naver.com/chlwlstjd10/222239136195
: “공용 설계도 창고”
클래스의 정의 정보(설계도)가 저장됨
모든 객체와 스레드가 공유함
예를 들어 public class Person을 JVM이 읽으면, 그 설계도는 메서드 영역에 올라갑니다.
비유로 다시
“학교에 한 번만 붙이는 시간표”
누구든(스레드든, 객체든) 시간표를 보면서 학습(동작)할 수 있습니다.
: “객체 저장 창고”
new 키워드로 생성한 객체(인스턴스)가 저장됨예시:
Person p1 = new Person();
p1이 참조하는 Person 객체는 힙에 생성됩니다.
비유
“여러 개의 책상(객체)을 사무실에 늘어놓고, 쓰지 않는 책상은 청소부(GC)가 치워감”
: “작업 메모지”
메서드가 호출될 때 **스택 프레임(Stack Frame)**이 생김
메서드가 끝나면 스택 프레임이 자동 소멸
예:
public void hello() {
int a = 10; // 로컬 변수
}
a는 스택에 저장되고, hello() 끝나면 사라짐.
비유
“작업할 때 잠깐 쓰는 포스트잇”
다 하고 나면 바로 떼어 버림.
: “지금 어디 실행 중인지 표시하는 책갈피”
멀티스레드 프로그램에서는 각 스레드가 자신만의 프로그램 카운터를 가지고 있습니다.
비유
“책 읽을 때 꽂아두는 책갈피”
예제 코드:
public class Example {
static int staticVar = 100;
int memberVar;
public void work() {
int localVar = 10;
Example e = new Example();
}
}
| 저장 위치 | 무엇이 저장되나? |
|---|---|
| 메서드 영역 | Example 클래스 정보, staticVar |
| 힙 | new Example() 생성된 객체 |
| 스택 | localVar, e 변수 (참조값만) |
| PC Register | 현재 수행 중인 명령어 |
자바 프로그램은
- 설계도 창고에 클래스 정의를 올리고
- **객체 창고(힙)**에 실제 데이터 테이블을 깔고
- **작업 메모지(스택)**에 일회성 변수 메모를 하고
- **책갈피(PC)**로 진행 상태를 추적합니다.