Java 메모리 - 코딩으로 살펴보는 스택 영역 변화
다음 코드를 실행한 경우 결과를 살펴보도록 한다.
Java 코드
import java.sql.SQLOutput;
public class Main {
public static void main(String[] args) {
System.out.println("Main Start");
method1(2);
System.out.println("Main End");
}
static void method1(int mem) {
System.out.println("method Start");
int cal = mem * 10;
method2(cal);
System.out.println("method1 End");
}
static void method2(int mem) {
System.out.println("method2 Start");
System.out.println("method2 End");
}
}
코드 실행 시 스택 영역 살펴보기
코드 실행 시 호출하는 구간마다 살펴 볼 것이다.
main() 호출
- 자바를 실행 시 main() 호출한다.
- 스택 영역에 main() 스택 프레임을 생성한다.
- main() 프레임에는 내부에 args 지역 변수를 갖고 있다.
- main() 코드에 있는
Main Start
문구를 출력한다.

method1() 호출
- main() 은 method1() 를 호출한다.
- 스택 영역에 mathod1() 스택 프레임을 생성한다.
- method1() 프레임 내부에 mem=2, cal=20 지역 변수가 스택 프레임에 포함한다.
- method1() 코드에 있는
method1 Start
문구를 출력한다.

method2() 호출
- method1() 은 method2() 를 호출한다.
- 스택 영역에 mathod2() 스택 프레임을 생성한다.
- method2() 프레임 내부에 mem=20 지역 변수가 스택 프레임에 포함한다.
- method2() 코드에 있는
method2 Start
문구를 출력한다. - method2() 코드에 있는
method2 End
문구를 출력한다.

method2() 호출 종료
- method2() 호출이 종료되어 스택 영역의 method2() 스택 프레임과 함께 mem=20 지역 변수도 삭제된다.
- method1() 으로 돌아와 코드에서 method2() 호출한 지점으로 이동한다.
- method1() 코드에 있는
method1 End
문구를 출력한다.
method1() 호출 종료
- method1() 호출이 종료되어 스택 영역의 method1() 스택 프레임과 함께 mem=2, cal=20 지역 변수도 삭제된다.
- main() 으로 돌아와 코드에서 method1() 호출한 지점으로 이동한다.
- main() 코드에 있는
Main End
문구를 출력한다.
main() 호출 종료
- main() 호출을 종료한다.
- 더 이상 호출한 메소드가 없고, 스택 영역이 비워져 있으므로 자바를 종료한다.
코드 실행 결과
Main Start
method Start
method2 Start
method2 End
method1 End
Main End
스택 영역 정리
- 자바는 스택 영역을 이용해서 메소드 호출과 지역 변수를 관리
- 메소드를 계속 호출한 경우 스택이 쌓이게 된다.
- 스택 프레임이 제거된 경우 지역 변수도 함께 제거한다.
- 스택 프레임 모두 제거 시 프로그램을 종료한다.