
JVM은 자바 애플리케이션을 실행하는 가상 머신으로, 자바 코드를 바이트코드로 변환한 후 이를 실행하는 역할을 한다.
이 과정에서 JVM은 메모리를 효율적으로 관리하기 위해 Runtime Data Area라는 공간을 사용한다.
Runtime Data Area는 JVM이 자바 프로그램 실행 중 사용하는 메모리 영역이다.
JVM의 Runtime Data Area는 다음과 같이 구성된다.

스택(Stack) 메모리
- 메서드 호출 시 개별적인 스택 프레임이 생성되며, 실행이 종료되면 해당 스택 프레임이 자동으로 제거
- 기본 타입의 값과 객체 참조 주소, 메서드의 지역 변수, 매개변수 등을 저장
스택 프레임(Stack Frame)은 각 메서드 호출 시 생성되는 독립적인 메모리 블록이다. 메서드 실행 시 자신만의 스택 프레임을 생성하여, 실행이 끝나면 해당 프레임이 제거된다.
각 스택 프레임은 다음과 같은 영역으로 구성된다.
1. Local Variables
: 메서드 내에서 선언된 지역 변수와 매개변수가 저장되는 영역
2. Operand Stack
: 메서드 실행 중 발생하는 연산을 위한 스택 구조로, 메서드가 수행하는 연산을 지원하는 임시 저장 공간
3. Frame Data
: 메서드 실행에 필요한 상태 정보와 예외 처리 정보를 저장하는 영역
메서드 호출: 새로운 메서드가 호출되면 스택 프레임이 생성되어 스택에 푸시
Stack Frame 내부 처리:
스택 프레임 관리: 스택 프레임은 LIFO 방식으로 Push/Pop, 메서드 실행이 끝나면 해당 스택 프레임이 자동으로 제거
프로그램 종료 또는 상위 메서드로 반환: 모든 메서드가 종료되면 스택이 비워짐

스택은 고정된 크기의 메모리 영역을 사용한다. 이때 메서드 호출이 너무 깊어지거나 지나치게 많은 지역 변수를 할당하면 스택이 가득 차는 스택 오버 플로우가 발생한다.
Ex) 과도한 재귀 함수

힙(Heap) 메모리
- 동적으로 생성된 객체나 배열이 저장되는 메모리 영역
- 프로그램 실행 중 필요에 따라 크기가 변할 수 있음
- JVM의 Garbage Collector을 통해 자동 관리
객체 생성: new 키워드 등을 사용하여 객체를 생성하면 힙 영역에 할당
객체 참조: 스택에 있는 참조 변수를 통해 힙 영역의 객체를 접근
Garbage Collector 관리: 사용되지 않는 객체는 자동으로 제거

< Young Generation(Eden + Survivor)>
- Eden 영역: 새롭게 생성된 객체가 먼저 할당되는 공간
- Survivor 영역(S0, S1): Eden 영역에서 살아남은 객체가 이동하는 공간
< Minor GC >
< Old Generation >
- Young Generation에서 여러 번 Minor GC를 거쳐 살아남은 객체가 이동하는 공간
- Old Generation에 할당된 객체는 Minor GC의 대상이 아니며, Major GC(Full GC)를 통해 관리
< Major GC(=Full GC) >
< Stop-the-World >
Garbage Collection 중에 JVM의 모든 애플리케이션 스레드가 멈추는 현상이다.
Full GC가 발생하면 Old Generation의 객체를 정리하는 과정에서 모든 객체를 검사해야 하므로, GC 작업을 진행하는 동안 애플리케이션의 실행이 중지된다.
메서드(Method) 영역
: 프로그램을 실행하는 데 필요한 공통 데이터를 관리하는 영역으로, 프로그램의 모든 영역에서 공유한다.