..

JVM Class Loading, Linking, and Initialization

TOC


  1. Overview
  2. 실행 흐름
  3. Class Loading
  4. Linking
  5. Initialization
  6. 정리
  7. Next Step

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