1 Runtime Data Area
- 런타임 데이터 영역은 JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역입니다.
- JVM은 프로그램 실행 중에 사용되는 다양한 런타임 데이터 영역을 정의합니다.
- 이러한 데이터 영역은 크게 두 가지로 분류됩니다:
- JVM 시작 시 생성되어 종료될 때까지 유지되는 영역
- 스레드별로 생성되고 스레드 종료 시 파괴되는 영역
- 구체적으로는 6개의 영역으로 나눌 수 있습니다:
- 스레드별 영역: PC 레지스터(PC Register), JVM 스택(JVM Stack), 네이티브 메서드 스택(Native Method Stack)
- 모든 스레드가 공유하는 영역: 힙(Heap), 메서드 영역(Method Area), 런타임 상수 풀(Runtime Constant Pool)

2 PC 레지스터
- JVM은 한 번에 여러 실행 스레드를 지원할 수 있습니다.
- 각 스레드는 자신만의 PC(Program Counter) 레지스터를 가지고 있습니다.
- PC 레지스터는 현재 수행 중인 JVM 명령의 주소를 갖는다.
- PC는 사실상 메소드 영역의 주소를 가리킨다
3 JVM 스택
- JVM 스택은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 생성됩니다.
- 스택은 지역 변수와 부분 결과를 보관하고 메서드 호출과 반환에 관여합니다.
- JVM 스택은 스택 프레임을 저장하는 스택이며 스택 프레임을 추가하거 나 제거하는 동작만 수행합니다.
- 메소드를 호출 할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행합니다.
- 예외 발생 시 printStackTrace() 등의 메서드로 보여주는 Stack Trace의 각 라인은 하나의 스택 프레임을 표현합니다.
- 스레드의 계산에 허용된 것보다 더 큰 JVM 스택이 필요한 경우, JVM은 StackOverflowError를 발생시킵니다.
- VM 스택이 동적으로 확장될 수 있는 상황에서, 확장이 시도되었으나 확장에 필요한 충분한 메모리를 사용할 수 없거나, 새 스레드를 위한 초기 JVM 스택을 생성하는 데 필요한 메모리가 부족한 경우, JVM은
OutOfMemoryError를 발생시킵니다.
3.1 스택 프레임

- JVM 내에서 메서드가 수행될 때마다 하나의 스택 프레임이 생성되어 해당 스레드의 JVM 스택에 추가되고 메서드가 종료되면 스택 프레임이 제거됩니다.
- 스택 프레임의 구성
- 지역 변수 배열(Local Variable Array)
- 피연산자 스택(Operand Stack)
- 현재 실행 중인 메서드가 속한 클래스의 런타임 상수 풀에 대한 레퍼런스를 갖는다.
- Return value
- 지역 변수 배열, 피연산자 스택의 크기는 컴파일 시에 결정되기 때문에 스택 프레임의 크기도 메서드에 따라 크기가 고정된다.
- 따라서 가변 길이의 객체와 배 열을 스택 프레임에 저장할 수 없다.
- 각 스레드의 JVM 스택에서는 오직 하나의 프레임만이 활성화되어 실행됩니다.
- 이를 현재 프레임(current frame)이라 하며, 이 프레임의 메서드를 현재 메서드(current method)라고 합니다.
- 현재 메서드가 정의된 클래스를 현재 클래스(current class)라고 합니다.
- 지역 변수와 피연산자 스택에 대한 모든 작업은 현재 프레임을 기준으로 이루어집니다.
- 프레임의 생명주기
- 현재 메서드가 다른 메서드를 호출하면, 새로운 프레임이 생성되어 현재 프레임이 됩니다.
- 메서드가 반환될 때, 현재 프레임은 필요한 경우 메서드의 실행 결과를 이전 프레임에 전달합니다.
- 이후 현재 프레임은 제거되고 이전 프레임이 다시 현재 프레임이 됩니다.
3.2 지역 변수 배열(Local Variable Array)
- 각 프레임은 지역 변수라고 알려진 변수 배열을 포함합니다. 프레임의 지역 변수 배열의 길이는 컴파일 시점에 결정됩니다.
- 지역 변수는 인덱스로 접근됩니다. 첫 번째 지역 변수의 인덱스는 0입니다.
- 지역 변수 배열에는
this
에 대한 참조와 Method의 Parameter Value 와 Local Variable을 저장합니다.
- 저장 순서는 this, Parameter Value, Local Variable 순입니다.
- instance method의 경우 지역 변수 0은 항상 인스턴스 메서드가 호출되는 객체에 대 한 참조(Java 프로그래밍 언어에서의 this)를 전달하는 데 사용됩니다.
- 이후 모든 매개변수는 지역 변수 1부터 시작하여 연속된 지역 변수에 전달됩니다.
- static method는 첫 번째 슬롯부터 메소드의 파라미터가 시작합니다.
3.3 Operand Stack
- 각 프레임은 피연산자 스택(operand stack)이라고 알려진 후입선출(LIFO) 스택을 포함합니다.
- Operand Stack 은 JVM 의 작업 공간입니다.
- JVM 이 연산에 필요한 데이터와 연산 결과를 Operand Stack에 넣고 처리합니다.
- 작동 방식은 하나의 Instruction이 연산을 위해 Operand Stack에 값을 넣으면 다음 Instruction에서는 이 값을 빼서 사용하게 됩니다.
- 연산의 결과 역시 Operand Stack에 저장된다 . Operand Stack 역시 Array로 구성되어 있으며 Stack의 구조로 Push, Pop 작업을 수행한다
4 네이티브 메서드 스택
- 자바 외의 언어로 작성된 네이티브 코드를 위한 스택이입니다.
- 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택으로, 언어에 맞게 C 스택이나 C++ 스택이 생성됩니다.
5 Method Area