☕️ JVM의 메모리 구조

팔리동·2021년 8월 24일
0
post-thumbnail

JVM의 메모리구조 중 콜 스택에 대해서 알아보자.
자바의 정석을 보고 정리했습니다.

JVM의 메모리 구조

  • 응용 프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

  1. 메서드 영역(method area)
    • 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다.
  1. 힙(Heap)
    • 인스턴스가 생성되는 공간, 프로그램 실행 주 생성되는 인스턴스 모두 이곳에 생성된다.
      즉, 인스턴스변수(class variable)들이 생성되는 공간이다.
  1. 호출스택(call stack 또는 execution stack)
    • 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

호출스택

호출스택의 특징

  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
  • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

예시를 보자

class CallStackTest{
    public static void main(String[] args) {
        firstMethod();
    }
    static void firstmethod() {
        secondMethod();
    }
    static void secondMethod() {
        System.out.pritln("secondMethod()");
    }
    // 결과 : secondMethod()
}
  • main메서드를 호출하면 firstmeThod를 호출하고 firstMethod가 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메서드에도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다.

profile
배움의 기록

0개의 댓글