Java Stack / Heap / Method Area 메모리 구조 완벽 이해하기
Java JVM을 공부할 때 가장 중요한 핵심이 바로:
Stack / Heap / Method Area
메모리 구조입니다.
실무에서도:
- OutOfMemoryError
- StackOverflowError
- GC 문제
- 메모리 누수
- 성능 튜닝
까지 전부 이 구조와 연결됩니다.
초보 시절에는 보통:
Heap = 객체
Stack = 지역변수
정도로만 외우고 넘어가기 쉽습니다.
하지만 실제로는:
- 객체 생성 과정
- 메서드 호출 구조
- 참조(reference)
- GC 동작
- static 메모리
전체를 이해해야 JVM이 제대로 보이기 시작합니다.
이번 글에서는:
- Stack / Heap / Method Area 역할
- 객체 생성 과정
- 참조 변수 구조
- 메서드 호출 흐름
- GC와의 관계
까지 깊게 정리해보겠습니다.
1. JVM 메모리 전체 구조
먼저 전체 그림.
Method Area
Heap
Stack
PC Register
Native Method Stack
여기서 핵심 3개가:
Stack
Heap
Method Area
입니다.
2. Stack이란?
Stack은:
메서드 실행 정보를 저장하는 영역
입니다.
저장되는 것:
- 지역 변수(Local Variable)
- 매개변수(Parameter)
- 메서드 호출 정보
- 참조 변수(reference)
3. Heap이란?
Heap은:
객체(Object)가 저장되는 영역
입니다.
예시:
User user = new User();
여기서:
new User()
객체는 Heap에 생성됩니다.
4. Method Area란?
Method Area는:
클래스 메타데이터 저장 영역
입니다.
저장 내용:
- 클래스 정보
- 메서드 정보
- static 변수
- Constant Pool
- 클래스 구조 정보
5. 가장 중요한 예제
아래 코드로 전체 메모리 흐름을 이해해보자.
public class User {
static int count = 1;
String name;
public User(String name) {
this.name = name;
}
public static void main(String[] args) {
int age = 10;
User user = new User("Kim");
}
}
6. 클래스 로딩 발생
프로그램 시작 시:
User.class 로딩
발생.
ClassLoader가 읽어서:
Method Area
에 클래스 정보 저장.
7. Method Area에 저장되는 것
예시:
User 클래스 정보
User 생성자 정보
main 메서드 정보
static 변수 count
등 저장.
8. static 변수는 어디 저장될까?
static int count = 1;
→ Method Area 계열 저장.
즉:
클래스 소속 데이터
입니다.
9. main() 호출 시 Stack 생성
main(String[] args)
실행 시:
Stack Frame 생성
됩니다.
10. Stack Frame이란?
메서드 호출마다 생성되는 실행 공간.
즉:
메서드 전용 작업 공간
입니다.
11. main Stack Frame 내부
main 실행 시 Stack에는:
args
age
user
같은 지역 변수 저장.
12. age 변수는 어디 저장될까?
int age = 10;
primitive 타입이므로:
Stack
에 직접 저장.
13. user 변수는 어디 저장될까?
User user
이건:
참조 변수(reference)
입니다.
즉 Stack에는:
객체 주소값
만 저장.
14. 실제 객체는 Heap에 생성
new User("Kim")
실행 시 Heap에:
User 객체 생성
됩니다.
15. 메모리 구조 그림
전체 그림:
Method Area:
User class
static count
Stack:
main frame
├─ age = 10
└─ user = 0x1000
Heap:
0x1000 -> User 객체
name = "Kim"
16. 매우 중요한 핵심
Stack에는 참조값
Heap에는 실제 객체
입니다.
이걸 반드시 이해해야 함.
17. 메서드 호출 시 Stack 변화
예시:
test();
호출 시:
새 Stack Frame 생성
됩니다.
18. 메서드 종료 시
메서드 종료되면:
Stack Frame 제거
됩니다.
즉:
지역 변수 자동 제거
구조.
19. 왜 Stack이 빠를까?
Stack은:
LIFO(Last In First Out)
구조.
즉:
- push/pop 매우 빠름
- 메모리 관리 단순
20. Heap은 왜 느릴까?
Heap은:
- 객체 동적 생성
- GC 관리 필요
- 메모리 탐색 필요
즉:
상대적으로 비용 큼
21. 객체 생성 비용이 존재하는 이유
new Object()
실행 시 실제로:
- Heap 공간 탐색
- 메모리 할당
- 객체 초기화
발생.
22. 참조(reference)란?
예시:
User a = new User();
User b = a;
메모리:
Stack:
a -> 0x1000
b -> 0x1000
즉:
같은 객체 참조
중.
23. 그래서 객체 수정 영향 발생
b.name = "Lee";
하면:
a.name
도 변경됨.
왜냐하면:
같은 Heap 객체 참조
중이기 때문.
24. GC와 Heap 관계
GC(Garbage Collector)는:
Heap 객체 정리 담당
입니다.
25. GC 대상 조건
예시:
user = null;
더 이상 참조 없으면:
GC 대상 가능
됩니다.
26. Stack 변수 제거되면?
메서드 종료 시:
Stack Frame 제거
즉 참조도 제거.
Heap 객체는:
참조 없으면 GC 대상
됨.
27. StackOverflowError란?
대표 사례:
void recursive() {
recursive();
}
무한 재귀.
결과:
Stack Frame 계속 증가
→ StackOverflowError.
28. OutOfMemoryError란?
대표 사례:
while(true) {
list.add(new Object());
}
Heap 객체 무한 증가.
결과:
Heap 부족
→ OOM 발생.
29. String은 어디 저장될까?
String s = "Java";
조금 특수.
문자열 리터럴은:
String Pool
영역 사용.
(JDK 버전에 따라 내부 구현 차이 존재)
30. static은 왜 Heap이 아닐까?
static은:
객체 소속 X
클래스 소속 O
이기 때문.
즉 Method Area 저장.
31. 객체 내부 필드는 어디 저장될까?
class User {
int age;
}
age는:
Heap 객체 내부
에 존재.
32. primitive vs reference 차이
| 타입 | 저장 방식 |
| int | 값 직접 저장 |
| Object | 주소(reference) 저장 |
33. 왜 Java가 포인터를 숨길까?
C/C++처럼 직접 포인터 조작 허용하면:
- 메모리 오염
- 보안 문제
- 시스템 충돌
위험 증가.
Java는:
reference 추상화
사용.
34. Method Area와 Metaspace
JDK8 이후:
PermGen 제거
↓
Metaspace 사용
구조 변경.
35. Metaspace란?
클래스 메타데이터 저장 영역.
즉:
Class 정보 저장
담당.
36. 실무에서 자주 하는 실수
1) Stack과 Heap 혼동
매우 흔함.
2) 참조 복사를 객체 복사라고 착각
User b = a;
객체 복사 아님.
참조 복사.
3) static 남용
메모리 오래 유지 가능.
37. 핵심 흐름 요약
ClassLoader
↓
Method Area 클래스 적재
↓
Stack 메서드 실행
↓
Heap 객체 생성
↓
참조 연결
↓
GC 메모리 회수
38. 가장 중요한 핵심 한 줄
Stack = 실행 흐름
Heap = 객체 저장
Method Area = 클래스 정보
39. 실무에서 JVM 메모리 이해가 중요한 이유
대표 사례:
| 문제 | 원인 |
| OOM | Heap 부족 |
| StackOverflow | 재귀 문제 |
| GC 지연 | Heap 과부하 |
| Metaspace OOM | 클래스 과다 로딩 |
40. 정리
Stack / Heap / Method Area는 단순 암기용 개념이 아닙니다.
실제로는:
- 객체 생성
- 메서드 호출
- 참조 구조
- GC
- JVM 동작
전체를 이해하는 핵심 메모리 구조입니다.
특히 실무에서는:
- Heap vs Stack
- 참조(reference)
- GC 대상 조건
- static 메모리
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
객체 생성 과정과 메모리 흐름
을 new 연산자부터 생성자 호출, 참조 연결, GC 대상화까지 JVM 내부 흐름 중심으로 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 참조 타입(Reference Type)과 객체 참조 완벽 이해하기 (0) | 2026.05.26 |
|---|---|
| Java 객체 생성 과정과 메모리 흐름 완벽 이해하기 (0) | 2026.05.26 |
| Java ClassLoader 동작 원리 완벽 이해하기 (0) | 2026.05.26 |
| Java JVM 구조 이해 완벽 정리 (0) | 2026.05.26 |
| Java 템플릿 메서드 패턴(Template Method Pattern) 완벽 이해하기 (0) | 2026.05.22 |
댓글