..
JVM Class Loading, Linking, and Initialization
TOC
Overview
이전 글에서는 class 파일이 어떻게 구성되는지 확인했다.
이번 글에서는 그 class 파일이 JVM 안에서 어떻게 사용되는지만 짧게 다룬다.
실행 흐름
간단히 보면 흐름은 아래와 같다. ```mermaid
flowchart TD A[java 명령 실행] –> B[Class Loading] B –> C[Linking] C –> D[Initialization] D –> E[main 메서드 실행]
이 그림은 `java` 명령부터 `main` 실행까지의 핵심 순서를 한 번에 보는 용도다.
세부 단계인 verification, preparation, resolution은 뒤에서 따로 설명한다.
### Class Loading
---
JVM은 필요한 `class`를 메모리로 읽어온다.
예를 들면 아래 같은 코드가 있을 때:
```java
public class Demo {
public static void main(String[] args) {
System.out.println("hi");
}
}
Demo가 처음 필요해지는 시점에 JVM은 Demo.class를 읽는다. 이 과정을 class loading이라고 한다.
Linking
Loading 다음에는 linking이 이어진다.
linking은 보통 세 단계로 생각하면 된다.
- Verification: class 파일이 JVM 규칙에 맞는지 확인
- Preparation: static 필드에 기본값 할당
- Resolution: constant pool의 심볼 참조를 실제 대상과 연결
즉, JVM은 그냥 바로 실행하지 않고 먼저 안전성과 연결 관계를 정리한다.
Initialization
마지막으로 initialization이 일어난다.
이 단계에서는 static initializer와 static field 초기화가 실제로 수행된다.
public class InitDemo {
static String name = init();
static String init() {
System.out.println("init");
return "demo";
}
}
InitDemo가 처음 사용될 때 init()이 실행된다. 즉, static 코드는 클래스가 정말 필요해지는 순간에 돈다.
정리
정리하면 이렇다.
- Loading: class 파일을 읽는다.
- Linking: 검증하고 연결한다.
- Initialization: static 코드를 실행한다.
Next Step
다음 글에서는 JVM Memory Structure: Stack, Heap, Method Area를 본다. stack, heap, method area를 짧게 나눠서 정리해보자.