컴파일된 자바 프로그램을 실행하면 새로운 JVM 프로세스가 시작되고 메인 스레드가 생성된다.
하나의 JVM을 프로세스 단위라고 할 수 있으며, 내부에는 여러개의 스레드들이 실행될 수 있다.
JVM 가상머신은 프로세스를 실행하면 OS로부터 Runtime Date Areas를 할당받는다.
컴파일이란, 자바 프로그램을 JVM 가상머신이 읽을 수 있는
.class
파일로 즉 바이트 코드로 변환해주는 작업을 의미한다. 바이트코드는 JVM 같은 가상머신이 이해할 수 있는 코드로 컴파일하는 것을 말하고, 가상머신은 바이트코드를 각 OS에 맞는 기계어로 변환한다.
런타임 데이터 영역은 JVM의 메모리 영역으로 자바 프로그램을 실행할때 사용되는 데이터들을 적재하는 영역이다.
Method Area
, Heap Area
는 모든 쓰레드가 공유하는 영역이고, 나머지 Stack
, PC Register
, Native Method Stacks
영역은 각 쓰레드 마다 개별로 생성되는 영역이다.
그럼 각 영역에 대해서 자세히 살펴보자.
JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 전역 변수(Static), 생성자와 메소드, 메소드 바이트 코드 등을 저장하는 공간이다.
클래스가 로드될 때 적재되서 프로그램이 종료될때 까지 저장되며, 모든 쓰레드가 공유하는 영역이다.
프로그램이 실행되면 모든 코드가 저장되어 있는 상태가 아니다.
프로그램 실행 중 클래스나 인터페이스를 사용하게 되면 JVM은 Class Loader를 통해 클래스와 인터페이스의 정보(메타 데이터)를 Method Area에 저장한다. 즉, 클래스 정보가 로드 되는 시점은 해당 클래스를 사용하기 위해 호출하는 시점이다.