Java의 메모리 영역

임유진·2025년 7월 2일

Java

목록 보기
3/12

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

출처 : https://blog.naver.com/chlwlstjd10/222239136195

1. Method Area (메서드 영역, 또는 Class Area)

: “공용 설계도 창고”

  • 클래스의 정의 정보(설계도)가 저장됨

    • 클래스 이름
    • 변수/메서드 정보
    • static 변수
    • static 블록
  • 모든 객체와 스레드가 공유

예를 들어 public class Person을 JVM이 읽으면, 그 설계도는 메서드 영역에 올라갑니다.

비유로 다시
“학교에 한 번만 붙이는 시간표”
누구든(스레드든, 객체든) 시간표를 보면서 학습(동작)할 수 있습니다.


2. Heap Area (힙 영역)

: “객체 저장 창고”

  • new 키워드로 생성한 객체(인스턴스)가 저장됨
  • 프로그램 실행 중에 동적으로 크기가 늘어날 수 있음
  • GC(Garbage Collector)가 사용하지 않는 객체를 찾아 자동으로 제거

예시:

Person p1 = new Person();

p1이 참조하는 Person 객체는 힙에 생성됩니다.

비유
“여러 개의 책상(객체)을 사무실에 늘어놓고, 쓰지 않는 책상은 청소부(GC)가 치워감”


3. Stack Area (스택 영역)

: “작업 메모지”

  • 메서드가 호출될 때 **스택 프레임(Stack Frame)**이 생김

    • 로컬 변수
    • 매개 변수
    • 연산 중간 결과
  • 메서드가 끝나면 스택 프레임이 자동 소멸

예:

public void hello() {
   int a = 10;  // 로컬 변수
}

a는 스택에 저장되고, hello() 끝나면 사라짐.

비유
“작업할 때 잠깐 쓰는 포스트잇”
다 하고 나면 바로 떼어 버림.


4. PC Register (프로그램 카운터 레지스터)

: “지금 어디 실행 중인지 표시하는 책갈피”

  • 현재 수행 중인 명령어 주소를 기록
  • 스레드마다 별도로 존재

멀티스레드 프로그램에서는 각 스레드가 자신만의 프로그램 카운터를 가지고 있습니다.

비유
“책 읽을 때 꽂아두는 책갈피”


5. Native Method Stack

  • 자바가 아닌 C/C++ 같은 네이티브 메서드를 호출할 때 사용하는 영역
  • 일반적인 자바 코드에서는 직접 쓰지 않지만, JVM 내부적으로 필요할 때 할당

실행 흐름 예시

예제 코드:

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현재 수행 중인 명령어

요약 비유

자바 프로그램은

  1. 설계도 창고에 클래스 정의를 올리고
  2. **객체 창고(힙)**에 실제 데이터 테이블을 깔고
  3. **작업 메모지(스택)**에 일회성 변수 메모를 하고
  4. **책갈피(PC)**로 진행 상태를 추적합니다.
profile
말하는 고구마

0개의 댓글