Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

프로그래밍 공부

[자바] #04. 자바에서의 메모리 구조 - 메소드 영역과 힙 영역 본문

자바

[자바] #04. 자바에서의 메모리 구조 - 메소드 영역과 힙 영역

하 냥 2025. 2. 14. 18:59

메소드 영역 (Method Area)

 클래스에 대한 정보(메타데이터)와 정적(static) 데이터가 저장되는 공간.

  • 클래스 로더(Class Loader)가 클래스를 로드할 때 생성됨.
  • 클래스의 메타데이터(클래스명, 메서드, 변수 정보)를 저장.
  • static 변수, static 메서드, 상수(Constant Pool) 정보도 저장됨.
  • JVM이 종료될 때까지 유지됨 (Garbage Collection의 영향을 받지 않음).

 

✨ 메소드 영역에 저장되는 내용

저장 데이터 설명
클래스 정보 클래스명, 패키지명, 부모 클래스 정보
메소드 정보 메서드의 바이트코드, 접근 제어자, 반환 타입 등
static 변수 모든 인스턴스가 공유하는 static 변수
상수 풀(Constant Pool) final static 상수와 문자열 리터럴

 

📌 메소드 영역 예제

class Example {
    static int staticVar = 100;  // 메소드 영역에 저장됨

    static void staticMethod() {  // 메소드 영역에 저장됨
        System.out.println("Static Method 실행!");
    }
}

public class Main {
    public static void main(String[] args) {
        Example.staticMethod();  // 메소드 영역에서 실행
    }
}

 

위의 main 메소드에서는 Example의 클래스 메소드에 접근하고 있다. 이렇듯 인스턴스의 생성 및 클래스 변수, 클래스 메소드에 접근하기 위해서는 먼저 해당 클래스의 바이트코드가 메모리 공간에 로딩되어야(메모리 공간에 올려져야) 하는데, 이때 로딩되는 메모리 공간이 바로 '메소드 영역'이다.

💡 실행 과정

  1. Example 클래스가 처음 로드될 때, 메소드 영역에 클래스 정보, static 변수 staticVar, static 메서드 staticMethod()가 저장됨.
  2. Example.staticMethod()가 호출되면, 메소드 영역의 staticMethod()를 실행.

static 변수와 static 메서드는 객체를 생성하지 않아도 메소드 영역에서 관리된다!
Garbage Collection의 대상이 아니므로 프로그램이 종료될 때까지 유지된다.


 

힙 영역 (Heap Area)

 

new 키워드로 생성된 객체와 인스턴스 변수를 저장하는 공간.

  • new 키워드로 생성된 객체(인스턴스)와 그 안의 인스턴스 변수(필드)가 저장됨.
  • 메모리 공간이 크고, 객체가 더 이상 참조되지 않으면 Garbage Collector(GC)에 의해 자동 삭제됨.
  • 인스턴스 변수(객체의 속성)는 힙에 저장되지만, 참조 변수는 스택에 저장됨.
  • GC(Garbage Collection)로 필요 없는 객체를 자동으로 정리함.
class Person {
    String name;  // 힙 영역에 저장됨
    int age;      // 힙 영역에 저장됨

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void introduce() {
        System.out.println("안녕하세요, 저는 " + name + "이고, 나이는 " + age + "살입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 30); // 힙 영역에 객체 생성
        Person p2 = new Person("김철수", 25); // 힙 영역에 객체 생성

        p1.introduce();  
        p2.introduce();
    }
}

📌 메모리 할당 과정 (p1과 p2의 저장 위치)

💡 1. main() 메서드 실행 (스택 생성)

  • main() 메서드가 실행되면서 스택(Stack) 영역에 main()의 스택 프레임이 생성됨.

💡  2. Person 객체 생성

Person p1 = new Person("홍길동", 30);
  • new Person("홍길동", 30); 실행 시, 힙(Heap) 영역에 Person 객체가 생성됨.
  • p1은 스택(Stack) 영역에 저장되며, 힙 영역의 Person 객체를 참조.
  • name 필드는 "홍길동" 문자열 객체를 가리키는 참조 변수이며, 문자열 리터럴 "홍길동"도 힙에 저장됨.
  • age 필드는 int 타입(기본형)이므로 힙에 직접 저장됨.

💡  3. Person 객체가 하나 더 생성됨

Person p2 = new Person("김철수", 25);
  • 또 다른 Person 객체가 힙에 생성됨.
  • p2는 스택에 저장되고, 힙의 새로운 Person 객체를 참조.
  • p2.name은 "김철수"를 참조하는 힙 메모리 주소를 가짐.
  • p2.age는 힙에 저장된 25 값을 가짐.

📌 최종 메모리 구조

✅ p1, p2는 스택에 저장된 참조 변수(레퍼런스)이며, 힙의 Person 객체를 가리킴.
✅ Person 객체 안의 name(String)과 age(int)는 힙에 저장됨.
✅ "홍길동", "김철수"는 자바의 String 풀 또는 힙 영역에 저장됨.


 

질문 1. Person 클래스 안의 String name, int age도 힙 영역에 저장되는가?

그렇다. new로 생성된 객체의 멤버 변수(name, age)는 힙 영역에 저장된다!

하지만 String name은 참조 변수이므로, "홍길동" 문자열 객체는 별도로 힙에 저장된다.
int age는 기본형(primitive type) 데이터라서 Person 객체 내부의 힙 메모리에 직접 저장된다.

 

 질문 2. 기본형 변수(int, double 등)는 스택에 저장되는 것 아닌가?

지역 변수(메서드 내부에 선언된 int, double 등)는 스택(Stack)에 저장된다.

그러나, new로 생성된 객체 안의 기본형 필드객체 내부(힙)에 저장된다.