컴파일된 자바 프로그램을 실행하면 새로운 JVM 프로세스가 시작되고 메인 스레드가 생성된다.

하나의 JVM을 프로세스 단위라고 할 수 있으며, 내부에는 여러개의 스레드들이 실행될 수 있다.

JVM 가상머신은 프로세스를 실행하면 OS로부터 Runtime Date Areas를 할당받는다.

컴파일이란, 자바 프로그램을 JVM 가상머신이 읽을 수 있는 .class 파일로 즉 바이트 코드로 변환해주는 작업을 의미한다. 바이트코드는 JVM 같은 가상머신이 이해할 수 있는 코드로 컴파일하는 것을 말하고, 가상머신은 바이트코드를 각 OS에 맞는 기계어로 변환한다.

1. Runtime Data Areas

런타임 데이터 영역은 JVM의 메모리 영역으로 자바 프로그램을 실행할때 사용되는 데이터들을 적재하는 영역이다.

Untitled

Method Area, Heap Area모든 쓰레드가 공유하는 영역이고, 나머지 Stack, PC Register, Native Method Stacks 영역은 각 쓰레드 마다 개별로 생성되는 영역이다.

그럼 각 영역에 대해서 자세히 살펴보자.

2. Method Area

JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 전역 변수(Static), 생성자와 메소드, 메소드 바이트 코드 등을 저장하는 공간이다.

클래스가 로드될 때 적재되서 프로그램이 종료될때 까지 저장되며, 모든 쓰레드가 공유하는 영역이다.

프로그램이 실행되면 모든 코드가 저장되어 있는 상태가 아니다.

프로그램 실행 중 클래스나 인터페이스를 사용하게 되면 JVM은 Class Loader를 통해 클래스와 인터페이스의 정보(메타 데이터)를 Method Area에 저장한다. 즉, 클래스 정보가 로드 되는 시점은 해당 클래스를 사용하기 위해 호출하는 시점이다.