
✅ 스택 영역과 힙 영역
스택 영역과 힙 영역이 함께 사용되는 경우를 알아보자.
✏️ Data
package memory;
public class Data {
private int value;
public Data(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
✏️ JavaMemoryMain2
package memory;
public class JavaMemoryMain2 {
public static void main(String[] args) {
System.out.println("main start");
method1();
System.out.println("main end");
}
static void method1() {
System.out.println("method1 start");
Data data1 = new Data(10);
method2(data1);
System.out.println("method1 end");
}
static void method2(Data data2) {
System.out.println("method2 start");
System.out.println("data.value = " + data2.getValue());
System.out.println("method2 end");
}
}
- main() → method1() → method2() 순서로 호출하는 단순한 코드다.
- method1()에서 Data 클래스의 인스턴스를 생성한다.
- method1()에서 method2()를 호출할 때 매개변수에 Data 인스턴스의 참조값을 전달한다.
🖥️ 실행 결과

⚙️ 실행 과정

- main() 메서드를 실행한다. main() 스택 프레임이 생성된다.
- main()에서 method1()을 실행한다. method1() 스택 프레임이 생성된다.
- method1()은 지역 변수로 Data data1을 가지고 있다. 이 지역 변수도 스택 프레임에 포함된다.
- method1()은 new Data(10)을 사용해서 힙 영역에 Data 인스턴스를 생성한다. 그리고 참조값을 data1에 보관한다.
- method1()은 method2()를 호출하면서 Data data2 매개변수에 x001 참조값을 넣는다.
- 이제 method1()에 있는 data1과 method2()에 있는 data2 지역 변수(매개변수 포함)는 둘 다 같은 x001 인스턴스를 참조한다.
- method2()가 종료된다. method2()의 스택 프레임이 제거되면서 매개변수 data2도 함께 제거된다.
- method1()이 종료된다. method1()의 스택 프레임이 제거되면서 지역 변수 data1도 함께 제거된다.

- method1()이 종료된 직후의 상태를 보자. method1()의 스택 프레임이 제거되고 지역 변수 data1도 함께 제거되었다.
- 이제 x001 참조값을 가진 Data 인스턴스를 참조하는 곳이 더는 없다.
- 참조하는 곳이 없으므로 사용되는 곳도 없다. 결과적으로 프로그램에서 더는 사용하지 않는 객체인 것이다.
- GC(가비지 컬렉션)은 이렇게 참조가 모두 사라진 인스턴스를 찾아서 메모리에서 제거한다.
참고 : 힙 영역 외부가 아닌, 힙 영역 안에서만 인스턴스끼리 서로 참조하는 경우에도 GC의 대상이 된다.
📚 정리
지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리된다.
'Back-end > Java' 카테고리의 다른 글
| [Java - 기본] static 변수2 (0) | 2024.04.18 |
|---|---|
| [Java - 기본] static 변수1 (0) | 2024.04.17 |
| [Java - 기본] 스택 영역 (0) | 2024.04.16 |
| [Java - 기본] 스택 영역 (0) | 2024.04.15 |
| [Java - 기본] 스택과 큐 자료 구조 (0) | 2024.04.15 |