💡 JVM Runtime Data Area
- 모든 스레드 공유하는 메모리 영역 (GC 대상)
1. 힙 영역 : new 키워드로 생성된 객체와 배열이 생성되는 영역
2. 메서드 영역 : 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 type 정보, Constant Pool, static 변수, final class 등이 생성되는 영역- 특정 스레드에 국한되는 메모리 영역
1. 스택 영역 : 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
2. PC 레지스터 : Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
3. 네이티브 메서드 스택 : Java가 아닌 C, C++로 작성된 메서드의 실행 스택 영역
💡 Constant Pool
- 런타임 영역에 생성되는 static 상수 저장소이다.
- 상수 풀은 Method Area, 정적영역에 있는 메모리기 때문에 GC의 대상에서 제외된다.
- Constant Pool 객체에 저장되며 아래와 같은 상수 객체를 가진다.
// 상수 풀에 저장되는 상수 객체 cp_info { u1 tag; //태그 u1 info[]; // 값 } /* tag는 1바이트 숫자로 구성되며 JVM 에게 아래와 같은 타입을 제공한다. Utf8: 1 Integer: 3 (Boolean, Short, Byte도 여기에 해당됨) Float: 4 Long: 5 Double: 6 Class reference: 7 String reference: 8 */
boolean
byte
short
int
long
long longTypeValue = 2147483648; // 컴파일 에러 발생 (int의 범위를 넘는다.)
long longTypeValue = 2147483648L; // 'L'을 붙혀 long타입의 값이라는 것을 명시하면 컴파일 에러가 발생하지 않는다.
float, double
float f = 1234.567; // double형이 기본형이기 때문에 컴파일 에러 발생
float f = 1234.567F; // 'F'를 붙혀 float타입이라는 것을 명시하면 컴파일 에러가 발생하지 않는다.