객체 헤더

Java에서 객체 헤더(object header)는 각 객체의 메타데이터를 저장하는 부분으로, JVM이 객체를 관리하는 데 필요한 정보를 포함합니다. 객체 헤더는 JVM 구현마다 다를 수 있지만, 일반적으로 다음과 같은 정보를 포함합니다:

  1. Mark Word:

    • Locking Information: 객체의 락 상태를 저장합니다. 이는 객체가 동기화 블록에 의해 잠겨 있는지 여부를 나타냅니다.
    • Hash Code: 객체의 해시 코드가 캐시될 수 있습니다.
    • Garbage Collection Information: GC 상태를 나타낼 수 있습니다.
    • Age: 객체의 "나이"를 추적하여 GC가 오래된 객체를 더 자주 수집할 수 있도록 합니다.
  2. Klass Pointer:

    • Class Metadata: 객체가 어떤 클래스의 인스턴스인지를 가리키는 포인터입니다. 이는 객체가 속한 클래스의 메타데이터를 참조합니다.

객체 헤더의 예

Java 64비트 HotSpot VM의 경우, 객체 헤더는 일반적으로 다음과 같이 구성됩니다:

  1. Mark Word: 64비트
  2. Klass Pointer: 64비트 (압축된 포인터 사용 시 32비트)

이러한 헤더는 JVM에서 객체를 관리하고 동기화, GC 등을 수행하는 데 필수적입니다.

예제 코드

다음은 객체 헤더의 역할을 간략히 보여주는 예제입니다:


public class Main {
    public static void main(String[] args) {
        Object obj = new Object();

        // System.identityHashCode는 객체의 헤더에 저장된 해시 코드를 반환
        int hashCode = System.identityHashCode(obj);
        System.out.println("HashCode: " + hashCode);

        // 기본 동기화 블록, 객체의 모니터 락을 획득
        synchronized (obj) {
            System.out.println("Object is locked");
        }
    }
}


이 예제에서:

  • System.identityHashCode(obj)는 객체의 해시 코드를 반환하는데, 이는 객체 헤더의 일부인 Mark Word에 저장될 수 있습니다.
  • synchronized (obj)는 객체의 모니터 락을 획득하여, 객체 헤더에 있는 락 정보를 사용합니다.

객체 헤더의 중요성

객체 헤더는 Java 객체의 중요한 부분으로, JVM이 객체를 효율적으로 관리하고 동기화, 해시 코드 계산, GC 등의 작업을 수행할 수 있도록 돕습니다. 이를 통해 JVM은 객체 지향 프로그램의 효율성을 극대화할 수 있습니다