스택 영역과 힙 영역이 함께 사용되는 경우를 알아보자.
package memory;
public class Data {
private int value;
public Data(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
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의 대상이 된다.
지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리된다.