java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역을 세부적으로 구분하여 사용합니다.
메소드 영역(Method Area), 힙 영역(Heap Area), n개의 스레드 안에서 사용하는 스택 영역(Stack)
클래스(.class)를 클래스 로더로 읽고 클래스별로 런타임 상수풀, 필드, 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등으로 분류하여 저장합니다. 메소드 영역은 JVM이 시작되는 시점에 생성되고 모든 스레드가 공유하는 영역입니다.
런타임 상수풀 : JVM 명령어는 클래스, 인터페이스, 클래스 인턴스나 배열에 대해 run-time layout에 의존하지 않습니다. 대신, Constant_pool 테이블에 정보를 참조합니다.
모든 Constant_pool 테이블은 아래 형식입니다.
cp_info {
ul tag;
ul info[];
}
Constant_pool 테이블의 각 항목은 1바이트 tag로 시작을 합니다. 정보 배열의 내용은 태그 값에 따라 달라집니다.
Constant_Class_info 구조체는 클래스와 인터페이스를 나타내기 위해 사용됩니다.
CONSTANT_Class_info {
ul tag;
ul name_index;
}
name_index 항목의 값은 상수 풀 테이블(Constant_pool table) 내에서 유효한 인덱스여야 합니다.
해당 인덱스에 위치한 상수 풀 항목은 내부 형식으로 인코딩된 유효한 이진 클래스 또는 인터페이스 이름을 나타내는 CONSTANT_Utf8_info 구조체여야 합니다.
배열은 객체이기 때문에 anewarray와 mulianewarray는 상수 풀 테이블의 CONSTANT_Class_info 구조체를 통해 배열 클래스를 참조할 수 있습니다.
이 구조체는 필드, 메서드, 인터페이스, 메서드를 나타내는 유사 구조입니다.
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_Methodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_String_info 구조체는 String 클래스의 상수 객체를 표현하기 위해 사용됩니다.
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
CONSTANT_Integer_info, CONSTANT_Float_info 구조체는 4바이트 수자(정수와 부동 소수점) 상수를 표현하기 위해 사용됩니다.
CONSTANT_Integer_info {
u1 tag;
u4 bytes;
}
CONSTANT_Float_info {
u1 tag;
u4 bytes;
}
CONSTANT_Long_info and CONSTANT_Double_info 구조체는 8바이트 숫자 상수를 표현하기 위해 사용됩니다.
CONSTANT_Long_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
CONSTANT_Double_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
클래스와 인터페이스를 나타내는 것 없이 필드와 메서드 정보를 나타내기 위해 사용됩니다.
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 descriptor_index;
}
상수 문자열 값을 나타내기 위해 사용됩니다.
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
메서드 핸들을 위해 사용됩니다.
CONSTANT_MethodHandle_info {
u1 tag;
u1 reference_kind;
u2 reference_index;
}
메서드 유형을 나타내는데 사용됩니다.
CONSTANT_MethodType_info {
u1 tag;
u2 descriptor_index;
}
invokedynamic 명령어에서 부트스트랩 메서드, 동적 호출 이름, 호출의 인수 및 반환 유형, 부트스트랩 메서드에 전달되는 추가 상수들의 시퀀스를 지정하는데 사용됩니다.
CONSTANT_InvokeDynamic_info {
u1 tag;
u2 bootstrap_method_attr_index;
u2 name_and_type_index;
}
JVM 내에서 동적 호출을 지원하기 위한 메커즘 중 하나입니다. 부트스트랩 메서드는 주로 람다 표현식, 인터페이스의 디폴트 메서드, 동적 언어와 같은 기능을 지원하기 위하여 Java 7 부터 도입된 invokedynamic 명령어와 함께 사용됩니다.
부트스트랩 메서드는 다음과 같은 역할을 합니다.
동적 호출 이름 지정 - 부트스트랩 메서드는 호출할 실제 메서드를 동적으로 선택하는데 사용됩니다. 동적 호출에 대한 이름이나 식별자가 부트스트랩 메서드에 전달됩니다.
호출할 메서드의 서명 지정 - 호출될 실제 메서드의 인수 및 반환 유형을 정의합니다.
추가적인 상수 제공 - 부트스트랩 메서드에는 호출시 사용할 추가적인 상수 값을 제공할 수 있습니다. 이런 상수들은 부트스트랩 메서드로 전달되어 동적 호출에 활용됩니다.
부트스트랩 메서드는 자바코드로 작성되며 JVM에서 동적 호출을 처리하기 위한 로직을 구현합니다. 이것은 정적 컴파일 단계에서는 호출되지 않고 런타임 JVM에 의해 호출됩니다.
Constant_pool oracle.com 참조
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.1
Constant_pool 테이블에는 4.4.1 부터 4.4.10 까지 클래스, 인터페이스, 필드, 메서드, 상수 등의 다양한 정보가 저장됩니다. 그리고 메소드 영역에 클래스나 인터페이스를 생성할 때 런타임 상수풀(Constant Pool)이 구성되는데 메서드 영역에서 사용 가능한 공간보다 더 많은 메모리가 필요하게 되면 OutOfmemory가 발생합니다.
가비지 컬렉터 (Serial GC, Parallel GC) (1) | 2024.01.06 |
---|---|
JVM 힙(Heap), 가비지컬렉션(Garbage Collection) (0) | 2024.01.05 |
자바 타입 정리 (0) | 2024.01.03 |
JPA 영속성 관리 (컨텍스트와 생명주기) (0) | 2024.01.02 |
JPA 엔티티 CRUD(조회 등록 수정 삭제) (1) | 2024.01.01 |
댓글 영역