java.exe로 JVM이 시작될 때, JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역
(WAS의 성능에 문제가 발생하면, 대부분 이 영역들이 원인(Memory Leak , GC 등))
Rumtime Data Area는 5가지 영역으로 구분된다.
PC, JVM stack, Native Method Stack 영역은 Thread별로 각각 생성되고,
Heap, Method Area 영역은 모든 Thread가 공유한다.
Thread의 Method가 호출될 때 수행할 정보(메소드 호출 주소, 매개 변수, 지역 변수, 연산 스택)가 Frame 이라는 단위로 JVM Stack에 저장된다.
Method 호출이 종료될 때 stack 에서 제거된다.
JVM 스택 영역은 스레드가 시작될 때 할당된다.
자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나다.
JVM 스택은 메소드를 호출할때마다 Frame을 추가하고(push), 메소드가 종료되면 해당 프레임을 제거(pop)한다.
프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나, 제거 된다.
변수가 이 영역에 생성되는 시점은 초기화 될 때, 즉 최초로 변수에 값이 저장될 때이다.
변수는 선언된 블록안에서만 스택이 존재하고 블록을 벗어나면 스택에서 제거된다.
🔻Example
//1번 char v1 = 'A'; //2번 if (v1 == 'A'){ int v2 = 100; double v3 = 3.14; } //3번 boolean v4 = true;
선언된 변수들은 실행순서에 따라 다음과 같이 스택에서 생성되고 소멸한다.
v2와 v3는 if 블록 내부가 실행되고 있을 때만 스택 영역에 존재하고, 실행 흐름이 if 블록을 빠져나가면 소멸
기본 타입 변수는 스택 영역에 직접 값을 가지고,
참조 타입 변수는 값이 아니라 힙 영역이나 메소드 영역의 객체 주소를 가진다.
Garbage Collection (GC)
- JAVA객체의 특징
- 객체는 금방 접근 불가능(Unreachable) 상태가 된다.
- Old Generation에서 Young Generatio으로의 참조는 아주 적다.
Heap의 인스턴스 중 Thread의 JVM Stack에 도달 할 수 없는 것(Unreachable)이 GC의 대상.
도달할 수 있는 것들을 pick한 후, 그 나머지를 메모리에서 제거한다. = Mark and Sweep
참조