스택 영역.
다음 코드를 실행하면 스택 영역에서 어떤 변화가 있는지 확인해봅시다.
JavaMemoryMain1
package memory;
public class JavaMemoryMain1 {
public static void main(String[] args) {
System.out.println("main start");
method1(10);
System.out.println("main end");
}
static void method1(int m1) {
System.out.println("method1 start");
int cal = m1 * 2;
method2(cal);
System.out.println("method1 end");
}
static void method2(int m2) {
System.out.println("method2 start");
System.out.println("method2 end");
}
}
실행 결과
main start
method1 start
method2 start
method2 end
method1 end
main end
호출 그림

- 처음 자바 프로그램을 실행하면
main()을 실행합니다. 이때main()을 위한 스택 프레임이 하나 생성됩니다.-
main()스택 프레임은 내부에args라는 매개변수를 가집니다.
-
-
main()은method1()을 호출합니다.method1()스택 프레임이 생성됩니다.-
method1()는m1,cal지역 변수(매개변수 포함)를 가지므로 해당 지역 변수들이 스택 프레임에 포함됩니다.
-
-
method1()은method2()를 호출합니다.method2스택 프레임이 생성됩니다.method2()는m2지역 변수(매개변수 포함)를 가지므로 해당 지역 변수가 스택 프레임에 포함됩니다.
종료 그림

-
method2()가 종료됩니다.- 이때
method2()스택 프레임이 제거되고, 매개변수m2도 제거됩니다.-
method2()스택 프레임이 제거 되었으므로 프로그램은method1()으로 돌아갑니다.- 물론
method1()을 처음부터 시작하는 것이 아니라method1()에서method2()를 호출한 지점으로 돌아갑니다.
- 물론
-
- 이때
-
method1()이 종료됩니다.- 이때
method1()스택 프레임이 제거되고, 지역 변수(매개변수 포함)m1,cal도 제거됩니다.- 프로그램은
main()으로 돌아갑니다.
- 프로그램은
- 이때
-
main()이 종료됩니다.- 더 이상 호출할 메서드가 없고, 스택 프레임도 완전히 비워졌습니다.
- 자바는 프로그램을 정리하고 종료합니다.
- 더 이상 호출할 메서드가 없고, 스택 프레임도 완전히 비워졌습니다.
정리
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리합니다.
- 메서드를 계속 호출하면 스택 프레임이 계속 쌓입니다.
- 지역 변수(매개변수 포함)는 스택 영역에서 관리합니다.
- 스택 프레임이 종료되면 지역 변수도 함께 제거됩니다.
- 스택 프레임이 모두 제거되면 프로그램도 종료됩니다.