저우즈밍 님의 "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 타입 상수를 참조하여 표현 (상수 풀 의존)
- 제약이 느슨함
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 7-1. 클래스 로딩 매커니즘: 클래스 로딩 처리 과정 (3) | 2024.12.23 |
---|---|
[JVM 밑바닥까지 파헤치기] 6-2. 클래스 파일 구조: 바이트코드 명령어 (2) | 2024.12.22 |
[JVM 밑바닥까지 파헤치기] 3-5. 가비지 컬렉터와 메모리 할당 전략: 저지연 가비지 컬렉터 (0) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터 (0) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-3. 가비지 컬렉터와 메모리 할당 전략: 구현 (1) | 2024.12.21 |