
JVM과정을 상세화 해서 나타낸 도식


런타임 데이터 영역은 자바 애플리케이션을 실행할 때 사용되는 데이터들이 저장되는 메모리 공간이다.
런타임 데이터 영역은 위에서 본것처럼 크게 다섯 가지 영역으로 나눠진다.
Thread가 공유하는 영역
Thread가 공유하지 않는 영역
각 영역들에 대해서 자세히 알아보자
메서드 영역은 JVM이 클래스를 로드할 때 메모리 공간을 할당받고, 클래스 메타데이터가 저장되는 영역이다.
메서드 영역은 모든 스레드가 공유하는 영역으로, JVM 시작 시 생성되어 JVM 종료 시 소멸된다. 클래스 로더가 로드한 클래스 정보를 저장하며, 공간이 부족하면 OutOfMemoryError가 발생한다.
힙 영역은 동적으로 할당된 객체와 배열을 저장하는 메모리 영역이다.
new로 생성된 객체와 배열이 저장되며, 크기가 동적으로 변하고 모든 스레드가 공유한다. 그리고 가비지 컬렉션(GC)이 동작한다.
힙 영역에는 객체의 실제 인스턴스 데이터가 저장되고, 객체를 가리키는 참조 변수는 스택에 저장된다.
스택 영역은 메서드 호출마다 생성되는 스택 프레임을 저장하는 영역이다.
각 스택 프레임에는 다음 정보가 포함된다.
스택 영역은 LIFO(Last In, First Out) 구조로 동작하기 때문에 메서드 호출과 종료 시 메모리 할당과 해제가 매우 빠르다.
크기가 제한되어 있어서 재귀 호출이 과도할 경우에는 StackOverflowError가 발생할 수 있다.
PC 레지스터는 각 스레드가 실행할 바이트코드 명령의 주소를 저장하는 영역이다.
멀티 스레드 환경에서 스레드 전환이 발생하더라도, 각 스레드는 자신만의 PC 레지스터를 통해 중단되었던 실행 지점부터 다시 실행할 수 있다.
JVM 실행 흐름을 제어하기 위한 기준점 역할을 한다.
네이티브 메서드를 실행 중인 경우에는 JVM 바이트코드를 실행하지 않으므로 PC 레지스터의 값은 정의되지 않는다.
네이티브 메서드 스택은 자바가 아닌 네이티브 언어(C, C++ 등)로 작성된 메서드가 실행될 때 사용하는 메모리 공간이다.
일반적인 자바 메서드는 자바 스택에서 실행되지만, native 메서드가 호출되면 JVM은 실행 제어를 네이티브 코드로 넘기고 이때 네이티브 메서드 스택이 사용된다.
자바 코드와 네이티브 코드의 연결은 주로 JNI(자바 코드가 네이티브 라이브러리와 상호작용할 수 있도록 해주는 인터페이스)를 통해 이루어지고, 네이티브 메서드 실행 중에는 해당 스택에서 지역 변수와 실행 상태가 관리된다.
네이티브 메서드 스택은 JVM 구현과 운영체제에 따라 동작 방식이 달라질 수 있는 플랫폼 종속적인 영역이라는 점이 특징이다.