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)라고 합니다.
- 지역 변수와 피연산자 스택에 대한 모든 작업은 현재 프레임을 기준으로 이루어집니다.