JVM의 메모리구조 중 콜 스택에 대해서 알아보자.
자바의 정석을 보고 정리했습니다.
class CallStackTest{
public static void main(String[] args) {
firstMethod();
}
static void firstmethod() {
secondMethod();
}
static void secondMethod() {
System.out.pritln("secondMethod()");
}
// 결과 : secondMethod()
}
1️⃣ ~ 2️⃣: 위의 예제를 실행시키면, JVM에 의해서 main메서드가 호출됨으로써 프로그램이 시작된다. 이 때, 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main매서드의 코드가 수행되기 시작한다.
3️⃣ : main메서드에서 firstMethod()를 호출한 상태이다. 아직 main메서드가 끝난 것은 아니므로 main메서드는 호출스택에 대기상태로 남아있고 firstMethod()의 수행이 시작된다.
4️⃣ : firstmethod()에서 다시 secondMethod()를 호출했다. firstMethod()는 secondMethod()가 수행을 마칠때까지 대기상태 대기상태에 있게 된다. secomdmethod()가 수행을 마쳐야 firstMethod()의 나머지 문장들을 수행할 수 있기 때문이다.
5️⃣ : secondMethod()에서 pritln()을 호출했다. pritln메서드에 의해 'secondMethod()'가 화면에 출력된다.
6️⃣ : println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 firstMethod()로 되돌아간다. 대기 중인던 secondmethod()는 println()을 호출한 이후부터 수행을 재개한다.
7️⃣ : secomdMethod()에 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한firstmethod()로 돌아간다.
8️⃣ : firstMethod()에도 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 main메서드로 돌아간다.
9️⃣ : main메서드에도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다.