
JVM의 구성 요소 중에서도 Runtime Data Area를 의미, 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
JVM 메모리 영역은 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 으로 나뉜다.

Method Area ( = Class Area, Static Area)
바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간으로 JVM이 시작될 때 생성된다.
- 모든 스레드가 공유하는 영역이다. (GC의 대상)
- JVM 시작 시 생성되고, 프로그램 종료 시까지 데이터 유지된다.
- JVM은 이 영역을 통해 실제 메모리 상의 주소를 찾아서 참조한다.
- 아래와 같은 초기화 코드 정보들이 저장된다.
- Field Info : 멤버 변수의 이름, 데이터 타입, 접근 제한자의 정보
- Method Info : 메소드 이름, 리턴 타입, 함수의 매개변수, 접근 제한자의 정보
- Type Info : Class 또는 Interface 여부, Type의 속성과 이름, Super Class의 이름
Heap Area
사용자가 관리하는 인스턴스가 생성되는 공간으로, 런타임 시 new 연산자로 생성한 인스턴스와 배열이 동적으로 할당되는 영역이다.
- 모든 스레드가 공유하는 영역이며, 동기화 문제가 발생할 수 있다.
- new 연산자로 생성되는 클래스, 인스턴스 변수, 배열 타입 등
Reference Type이 저장되는 곳이다.
Heap Area에 생성된 객체와 배열은 Reference Type으로 인스턴스가 저장되는게 아닌, 포인터가 저장된다.
- Heap의 참조 주소는 스택이 가지고 있으며 해당 객체를 통해서만
Heap Area에 있는 인스턴스를 핸들링할 수 있다.
- 참조하는 변수나 필드가 없다면 쓰레기 객체로 취급하여
Garbage Collector를 통해 힙 영역에서 자동으로 제거된다. (GC의 대상)
Heap Area는 크게 Young Generation과 Old Generation 영역으로 구분된다.
Young Generation
- Eden : new를 통해 새로 생성된 객체가 위치. GC 실행 후 살아남은 객체들은 Survivor 영역으로 이동한다.
- Survivor 0, Survivor 1 : 각 영역이 채워지면 살아남은 객체는 순차적으로 비워진 Survivor 영역으로 이동한다.
Old Generation
- 생명 주기가 긴 객체를 GC 대상으로 하는 영역. Young Generation 영역에서 마지막까지 살아남은 객체가 이동한다.

Stack Area
int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
- 메소드 내에 정의된 지역변수(기본 자료형 및 참조 자료형)의 데이터 값이 저장
- 스레드 제어를 위해 사용되는 메모리 영역
- 각 스레드 마다 스택 영역이 하나씩 존재, 스레드가 시작 될 때 할당
- 메소드가 호출되면 메소드와 메소드 정보는 스택에 쌓이게 되고 메소드 호출이 종료될 때 스택 포인트에서 제거된다.
- 메소드 종료 시 메모리 공간이 사라진다.
PC Register
현재 수행중인 JVM 명령어 주소를 저장하는 공간으로, 스레드가 시작될 때 생성된다.
- 스레드가 어떤 명령을 실행하여야 하는 지에 대한 기록을 가짐
- 현재 작업하는 내용을 CPU에게 연산으로 제공하기 위한 버퍼 공간
Native Method Stack
실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
- C, C++ 등 JAVA 외 언어로 작성된 네이티브 코드를 실행하기 위한 공간
- 일반적인 C 스택 메모리 영역을 사용한다.
- JIT 컴파일러에 의해 변환된
Native Code 역시 이곳에서 실행
참고:
JVM 내부 구조 & 메모리 영역 총정리 - Inpa Dev - 티스토리
[JAVA] JVM의 메모리 구조
[Java] 자바 JVM 내부 구조와 메모리 구조에 대하여 - 코딩팩토리