본문 바로가기
language/java

Java Stack / Heap / Method Area 메모리 구조 완벽 이해하기

by 죄니안죄니 2026. 5. 26.
반응형

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 내부 흐름 중심으로 깊게 정리해보겠습니다.

반응형

댓글