프로그래밍 공부
[자바] #04. 자바에서의 메모리 구조 - 메소드 영역과 힙 영역 본문
메소드 영역 (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의 클래스 메소드에 접근하고 있다. 이렇듯 인스턴스의 생성 및 클래스 변수, 클래스 메소드에 접근하기 위해서는 먼저 해당 클래스의 바이트코드가 메모리 공간에 로딩되어야(메모리 공간에 올려져야) 하는데, 이때 로딩되는 메모리 공간이 바로 '메소드 영역'이다.
💡 실행 과정
- Example 클래스가 처음 로드될 때, 메소드 영역에 클래스 정보, static 변수 staticVar, static 메서드 staticMethod()가 저장됨.
- 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로 생성된 객체 안의 기본형 필드는 객체 내부(힙)에 저장된다.
'자바' 카테고리의 다른 글
| [자바] #06. 배열의 정렬 sort (0) | 2025.02.15 |
|---|---|
| [자바] #05. Object 클래스에 정의되어 있는 주요 메소드 (equals, clone) (0) | 2025.02.14 |
| [자바] #03. 예외 클래스의 구분, try-with-resources 구문 (0) | 2025.02.14 |
| [자바] #02. 디폴트 메소드(Default Method) (0) | 2025.02.14 |
| [자바] #01. 업캐스팅(Upcasting)과 다형성(Polymorphism) (1) | 2025.02.14 |