..
JVM Class Loading, Linking, and Initialization
TOC
Overview
앞 글에서는 class 파일 안에 무엇이 들어가는지 봤다.
이번 글에서는 그 class 파일이 JVM 안에서 어떻게 사용되는지만 짧게 본다.
Class Loading
JVM은 필요한 class를 메모리로 읽어온다.
예를 들면 아래 같은 코드가 있을 때:
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 Runtime Data Areas: Stack, Heap, Method Area를 본다. stack, heap, method area를 짧게 나눠서 정리해보자.