RunTime Data Area
- Runtime Data Area는 JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역이다.
- Runtime Data Area는 5가지로 구분된다.
- PC Register
- JVM stack
- Native Method stack
- Heap
- Method Area
- 위 그림에서 확인할 수 있듯이 1 ~ 3 영역은 Thread별로 생성되고 4 ~ 5 영역은 모든 Thread가 공유한다.
1. PC Register (Thread별로 1개씩 존재)
스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분이다. (JVM 명령의 주소를 가진다.)
- Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다. (Register-Base가 아닌 Stack-base로 작동)
- 현재 수행 중인 JVM Instruction의 주소를 가진다.
2. JVM stack (Thread별로 1개씩 존재)
지역변수, 매개변수, 메소드 정보, 임시 데이터 등을 저장한다.
- Thread의 Method가 호출될 때 수행 정보(메소드 호출 주소, 매개변수, 지역 변수, 연산 스택)가 Frame이라는 단위로 JVM stack에 저장된다. 그리고 Method 호출이 종료될 때 stack에서 제거된다.
3. Native Method stack(Thread별로 1개씩 존재)
실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
- Java 외의 언어로 작성된 네이티브 코드들을 위한 stack
ex) JNI를 통해 호출되는 C/C++ 등의 코드
4. Heap (모든 Thread가 공유)
런타임에 동적으로 할당되는 데이터가 저장되는 영역이다. 객체나 배열 생성이 여기에 해당한다.
- 인스턴스와 배열이 동적으로 생성되는 공간이다.
- 그리고 Garbage Collection의 대상이 되는 영역이다.
- 개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없고 오히려 부작용만 낳을 가능성이 크다.
- 모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.
5. Method Area(모든 Thread가 공유)
JVM이 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관한다.
- Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장된다.
- 이 영역에 등록된 class만이 Heap에 생성될 수 있다.
- 사실 Method Area는 논리적으로 Heap에 포함된다.
- 더 구체적으로는 Heap의 PermGen이라는 영역에 속한 영역인데, Java 8 이후로는 Metaspace라는 OS가 관리하는 영역으로 옮겨지게 된다.