
스택 영역과 힙 영역이 함께 사용되는 경우를 알아보자.
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의 대상이 된다.
지역 변수는 스택 영역에, 객체(인스턴스)는 힙 영역에 관리된다.