Application이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받습니다. 그리고 이 메모리를 역할에 따라 여러 영역으로 나누어서 관리를 합니다. 그 중 3가지 주요 영역(method area, call stack, heap)에 대해서 알아보겠습니다.
JVM 메모리 구조
1. 메서드 영역 (method area)
프로그램 실행 중에 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일을 읽어서 분석하여 클래스에 대한 정보를 이 영역에 저장합니다. 물론, 클래스의 클래스 변수도 이 영역에 함께 저장됩니다.
2. 힙(heap)
인스턴스가 생성되는 공간입니다. 즉, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성됩니다. 인스턴스 변수도 이 영역에 생성이 되는 것이죠.
3. 호출스택 (call stack/execution stack)
메서드의 작업에 필요한 메모리 공간을 제공합니다. 즉, 메서드가 호출되면 그 호출된 메서드를 위한 메모리가 할당되고, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용됩니다. 메서드가 종료되면 사용된 메모리 공간은 반환되고 비워지게 됩니다.
여기서 스택이라는 용어가 사용된 이유가 있습니다. 우리가 응용 프로그램을 실행시키면 보통 그 프로그램을 구성하는 메서드는 1개가 아니라 여러 개 입니다. 그리고 각 메서드를 위한 메모리 공간은 서로 구별됩니다. 따라서, 첫 번째 메서드가 호출되면 메모리 작업 공간이 호출 스택의 맨 밑에서 마련이 되고, 그 후 첫 번째 메서드로부터 다른 메서드가 호출되면 바로 위에 메모리 공간이 마련되는 과정이 반복됩니다. 즉, 호출된 메서드 순서대로 메모리 작업 공간이 맨 밑부터 쌓이면서 올라가게 되는 것이죠. 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이고, 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드임을 알 수 있습니다.
'Java' 카테고리의 다른 글
다형성(Polymorphism) (2) | 2023.10.15 |
---|---|
추상클래스(Abstract)과 인터페이스(Interface) (0) | 2023.10.15 |
제어자 (static과 final) (0) | 2023.10.15 |
가변인자(varargs) (0) | 2023.10.14 |
자바의 변수 (종류 및 초기화) (0) | 2023.10.14 |