Java

[JVM 밑바닥까지 파헤치기] 6-1. 클래스 파일 구조: 클래스 파일

noahkim_ 2024. 12. 22. 13:48

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

1. 클래스 파일

  • 하위 호환성을 위해 예전부터 지금까지 기존의 구조를 유지한 채 확장되어왔음
  • 하나의 클래스 또는 인터페이스를 정의
  • 바이트를 하나의 단위로 하는 이진 스트림 집합체
  • 빅 엔디언 방식

 

2. 의사 구조

ClassFile {
    u4 magic;                          // 매직 넘버 (0xCAFEBABE)
    u2 minor_version;                  // 클래스 파일의 마이너 버전
    u2 major_version;                  // 클래스 파일의 메이저 버전
    u2 constant_pool_count;            // 상수 풀 항목의 개수
    cp_info constant_pool[constant_pool_count-1];  // 상수 풀 테이블
    u2 access_flags;                   // 접근 플래그 (public, final 등)
    u2 this_class;                     // 현재 클래스 정보 (상수 풀 인덱스)
    u2 super_class;                    // 슈퍼 클래스 정보 (상수 풀 인덱스)
    u2 interfaces_count;               // 구현된 인터페이스 개수
    u2 interfaces[interfaces_count];   // 인터페이스 목록 (상수 풀 인덱스)
    u2 fields_count;                   // 필드 개수
    field_info fields[fields_count];   // 필드 테이블
    u2 methods_count;                  // 메서드 개수
    method_info methods[methods_count];// 메서드 테이블
    u2 attributes_count;               // 속성 개수
    attribute_info attributes[attributes_count];   // 속성 테이블
}
  • 데이터 저장 방식

 

구성

  • 부호 없는 숫자
    • 기본 데이터 타입
  • 테이블
    • 복합 데이터 타입 표현 (여러 부호 없는 숫자나 또 다른 테이블로 구성됨)
    • _info로 끝남

 

3. 매직 넘버

  • 가상 머신이 허용하는 클래스 파일인지 확인하는 용도
  • 모든 클래스파일의 첫번째 4바이트는 매직 넘버로 시작
  • 0xCAFEBABE

 

4. 버전 번호

  • 마이너 버전 (5~6 바이트)
  • 메이저 버전 (7~8 바이트)
  • JDK 릴리스 버전이 높아질 수록 1씩 증가
  • 하위 버전은 상위 버전의 코드를 실행할 수 없음

 

5. 상수 풀

타입

  • 17가지 타입으로 구성됨
  • CONSTANT_Utf8_info (tag=1, length, bytes)
  • CONSTANT_Integer_info (tag=3, bytes)
  • CONSTANT_Float_info (tag=4, bytes)
  • CONSTANT_Long_info (tag=5, bytes)
  • ...

 

구성

리터럴
  • 상수

 

심벌 참조
  • 컴파일 관련
  • export or import하는 패키지
  • FQCN
  • field name (+descriptior)
  • method name (+descriptior)
  • method hadler, method type, invoke dynamic

 

동적 링크

  • 클래스 로딩은 런타임에서 동적으로 이루어지며 이 단계에 링크 과정이 수행됨
  • 메모리에 어떻게 담길지는 런타임에 수행됨
  • 이 때 심벌 참조들을 실제 메모리로 변환함

 

6. 접근 플래그

  • 상수 풀 다음의 2바이트
  • 접근 정보 식별

 

종류

  • ACC_PUBLIC
  • ACC_FINAL
  • ACC_SUPER
  • ...

 

7. 인덱스

  • 클래스 파일의 상속 관계 정의

 

클래스 인덱스

부모 클래스 인덱스

인터페이스 인덱스

 

8. 필드 테이블

field info {
    u2                  access_flags;
    u2                  name_index;
    u2                  descriptor_index;
    u2                  attributes_count;    
    attribute_info      attribute[attributes_count];    
}
  • 인터페이스나 클래스 안에 선언된 변수들을 설명
  • access modifier, static, final, volatile, transient, type, field name

 

9. 메서드 테이블

field info {
    u2                  access_flags;
    u2                  name_index;
    u2                  descriptor_index;
    u2                  attributes_count;    
    attribute_info      attribute[attributes_count];    
}

 

10. 속성 테이블

  • 모든 속성에 대한 타입이 존재 (30개)
    • ConstantValue, Code, Exceptions, SourceFile ...
    • 속성마다 구조가 다름

 

표현

attribute_info {
    u2                  attribute_name_index;
    u4                  attribute_length;
    u1                  info[attributes_count];    
}
  • 속성은 CONSTANT_Utf8 타입 상수를 참조하여 표현 (상수 풀 의존)
  • 제약이 느슨함