런타임 데이터 영역(Runtime Data Area)은 JVM이 자바 프로그램 실행을 위한 데이터와 명령어를 저장하기 위해 OS로부터 할당받는 메모리 공간이다.
Runtime Data Area는 크게 Method영역, Heap영역, Stack영역, PC 레지스터 영역, Native Method Stack으로 나눌 수 있다.
-
클래스 로더에 의해 로드된 클래스, 메소드 정보와 클래스 변수의 정보가 저장되는 영역이다. 프로그램 시작부터 종료될때까지 메모리에 적재되지만 명시적 null 선언시 GC가 청소하도록 만들 수 있다.
-
데이터가 가장 먼저 저장되는 영역이며, 모든 스레드가 공유한다.
-
런타임
시 결정되는 참조 자료형이 저장되는 영역이다. new 연산자를 통해 생성된 객체(인스턴스)도 이곳에 저장된다. -
객체가 더 이상 쓰이지 않거나 명시적 null 선언 시 GC가 청소하도록 할 수 있다. 모든 스레드가 공유한다.
-
컴파일
시 결정되는 기본자료형과 참조변수가 저장되는 영역이다. (기본자료형은int
, 'double'과 같은 자료형, 참조변수는 WapperClass인Integer
,Double
과 같은 자료형을 말한다.) -
Stack영역은 각 스레드별로 하나씩 생성되는데, 메소드가 호출될 때마다 이 영역에 각각의
스택 프레임
이 만들어져 그 메소드에 대한 정보를 저장한다. 스택프레임은 스코프를 벗어나거나 메소드가 종료될 때 삭제된다. -
각 스레드별로 생성된다.
-
JVM이 수행할 명령어의 주소를 저장하는공간이다. OS의 PC 레지스터와 유사한 역할이나 CPU와는 별개로 JVM이 관리한다.
-
각 스레드가 시작될 때마다, 스레드별로 생성된다.
-
바이트코드가 아닌 기계어로 작성된 코드를 실행하는 공간이다. 다른 언어(c/c++)로 작성된 코드를 수행하기 위해 존재한다.
-
JNI(Java Native Interface) 호출 시 생성되며, Java Stack에서 Native Stack으로 동적 연결(Dynamic Linking)을 통해 확장된다. 각 스레드별로 생성된다.