JAVA
JVM 초기화 과정(Loading, Linking, Initialization)
icedstone
2025. 3. 13. 17:32
반응형
Java Virtual Machine(JVM)의 실행 과정은 크게 클래스 및 인터페이스의 로딩(Loading), 연결(Linking), 초기화(Initialization) 세 단계로 이루어집니다.
- 로딩(Loading): JVM은 실행 시 필요한 클래스나 인터페이스를 동적으로 로드합니다. 이는 해당 클래스나 인터페이스의 바이너리 표현을 찾아 이를 JVM의 메서드 영역(Method Area)에 로드하는 과정입니다.
- 연결(Linking): 로드된 클래스나 인터페이스를 JVM의 런타임 상태에 결합하여 실행 가능하게 만드는 과정입니다. 연결은 다음 세 단계로 구성됩니다:
- 검증(Verification): 클래스 파일의 형식과 구조가 JVM의 명세에 부합하는지 확인합니다.
- 준비(Preparation): 클래스나 인터페이스의 정적 필드를 위한 메모리를 할당하고, 기본값으로 초기화합니다.
- 해결(Resolution): 상징적 참조를 실제 메모리 주소로 변환하여 연결합니다.
- 초기화(Initialization): 클래스나 인터페이스의 초기화 메서드를 실행하여 정적 필드(static field)에 값을 할당하고, 정적 블록(static block)을 수행합니다.
이러한 단계를 통해 JVM은 프로그램 실행에 필요한 클래스와 인터페이스를 적재하고, 이를 실행 가능한 상태로 준비하며, 최종적으로 초기화하여 프로그램을 실행합니다.
반응형
각 메모리 영역에 대해서는 조만간(언젠가) 포스팅할 예정입니다.
위의 과정에서 각 정보들이 Method Area(일부 Heap)에 정보가 적재되는데 이 때 Method Area에는 다음과 같은 정보가 저장된다.
- 클래스(또는 인터페이스)의 런타임 구조 정보
- 런타임 상수 풀 (Runtime Constant Pool)
- 필드 정보 (Field Data)
- 메서드 정보 (Method Data)
- 메서드 디스크립터 (Method Descriptor)
- 클래스 초기화 및 정적 블록 정보
즉, static 정보와 meta 정보들이 Loading, Linking, Initialization 과정에서 저장되어진다.
그렇다면 Method Area의 일부인 Runtime Constant Pool에 데이터가 각 단계 별로 어떻게 저장되는지 아래 소스코드를 보면서 확인해보자.
public class Example {
static final int A = 10;
static final String STR = "Hello";
static int B = 20;
static final double PI;
static {
PI = Math.PI;
}
}
변수 | Loading | Preparation | Resolution | Initialization |
A = 10 | O (존재) | O (설정됨) | O (사용가능) | O (유지됨) |
STR = "Hello" | O (존재) | O (설정됨) | O (사용가능) | O (유지됨) |
B = 20 | X (없음) | O (0으로 설정) | O (사용가능) | O (20으로 변경) |
PI = Math.PI | X (없음) | X (없음) | X (없음) | O (3.14...으로 설정) |
참조
반응형