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

스택 영역 정리

  • 자바는 스택 영역을 이용해서 메소드 호출과 지역 변수를 관리
  • 메소드를 계속 호출한 경우 스택이 쌓이게 된다.
  • 스택 프레임이 제거된 경우 지역 변수도 함께 제거한다.
  • 스택 프레임 모두 제거 시 프로그램을 종료한다.