..

JVM Class Loading, Linking, and Initialization

TOC


  1. Overview
  2. Class Loading
  3. Linking
  4. Initialization
  5. 정리
  6. Next Step

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를 짧게 나눠서 정리해보자.