JVM이 운영체제로부터 할당받은 메모리영역.
Runtime Data Area는 총 다섯개의 영역으로 이루어져 있다.
위의 그림처럼 Runtime Data Area의 Stack, PC Register, Native Method Stack은 쓰레드가 생성될 때마다 하나씩 새로 생성되어 쓰레드에 할당되고, Method Area와 Heap은 JVM이 시작될 때 할당되어 모든 쓰레드가 공유한다.
이 때, 각각의 쓰레드는 다른 쓰레드에게 할당된 메모리 영역을 침범할 수 없기 때문에 코드를 작성할 때 지역변수의 동시성 문제를 고려하지 않아도 된다.
클래스에 대한 정보가 올라오는 영역으로 모든 쓰레드가 공유함. Static영역
프로그램 실행 중 클래스나 인터페이스를 사용하게 되면 JVM은 ClassLoader에게 요청하여 클래스와 인터페이스의 메타데이터를 Method Area에 저장한다.
클래스에 대한 정보가 이 영역에 존재하기 때문에 인스턴스를 생성하기 위해서는 Method Area를 참조해야 하며, 따라서 모든 쓰레드가 이 영역을 공유하게 된다.
Method Area에 저장되는 Metadata는 다음과 같다.
즉, Method Area에는 Class에 대한 모든 정보가 Byte Code의 형태로 로드된다.
new 키워드를 통해 동적으로 생성된 인스턴스 객체가 저장되는 영역으로 모든 쓰레드가 공유하며, Garbage Collection의 대상이 되는 영역이다
Heap에는 프로그램이 실행되면서 동적으로 생성된 인스턴스가 저장되고, 그 Reference를 Stack에 저장한다. 즉, Heap영역에 있는 인스턴스는 접근하기 위해서는 Stack에 저장되어있는 Reference를 통해 접근이 가능하다.
만약 Heap영역이 가득 차게 되면 OutOfMemoryError가 발생한다
또한 JVM은 효율적인 메모리영역의 관리를 위해 Garbage Collection을 수행하는데, Heap 영역이 Garbage Collection의 대상이 된다.
Heap영역은 효율적인 Garbage Collection을 위해 크게 3가지 영역으로 구분된다.
지역변수, 메소드의 매개변수, 리턴값 등 임시적으로 사용되는 값들이 저장되는 영역으로 PC Register, Native Method Stack과 함께 쓰레드가 생성될 때마다 할당된다.
프로그램 실행 시 메소드가 실행되면 JVM은 Stack영역에 해당 메소드의 frame을 push하고, 데이터를 임시적으로 저장한다. 메소드가 종료되면 Stack에서 해당 메소드의 frame을 pop한다.
Stack의 기본 자료구조인 Frame은 아래 세 가지 요소로 구성되어있다.
Constant Pool Reference : Method Area의 Runtime Constant Pool에 대한 참조
Local Variables Array : 매소드 내의 지역변수를 담고있는 배열
Operand Stack : 피연산값과 계산과정에서 생기는 중간값을 저장
만약 쓰레드가 사용할 수 있는 스택의 크기를 넘기게 되면 StackOverflowError 가 발생한다. 또한 스택을 동적으로 확장할 때 확장할 메모리가 부족하거나 새로운 쓰레드 생성 시 스택에 할당할 메모리가 부족하면 OutOfMemoryError 가 발생한다.
Stack, Native Method Stack과 함께 쓰레드가 생성될 때 각 쓰레드마다 할당되는 영역으로, 현재 수행중인 JVM의 명령어 주소를 저장한다.
JVM은 Stack-Base방식으로 작동하기 때문에 Stack에서 Operand를 뽑아내에 별도의 메모리 공간에 저장한 다음 연산을 진행하는데, 이때 사용되는 메모리공간이 PC Register이다.
PC Register에는 멀티 쓰레드 프로그래밍 환경에서 한 쓰레드가 작업을 하다가 다른 쓰레드로 CPU자원을 넘겨주고 다시 받았을 때, 이어서 작업을 하기 위해 현재 실행중인 명령어의 주소를 기록한다.
만약 쓰레드가 JVM Instruction을 수행중이라면 Instruction의 주소를 가지고 있지만, Native Method를 수행중이라면 PC Register는 Undefined상태로 남아있고, 이에 대한 처리는 Native Method Stack에서 담당한다
Native 언어(C/C++, 어셈블리)로 작성된 코드를 실행하기 위한 메모리 영역