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()을 실행한다. 이때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()이 종료된다. 더 이상 호출할 메서드가 없고, 스택 프레임도 완전히 비워졌다. 자바는 프로그램을 정리하고 종료한다.