hyeonga_code
JVM_05_JVM 구성 요소_Runtime Data Area_힙 영역 본문
JVM 구성 요소
- Class Loader
- Bootstrap Class Loader
- Extension Class Loader
- System/Application Class Loader
- Execution Engine
- Runtime Data Area
런타임 데이터 영역 Runtime Data Area
프로그램의 실행 도중 사용되는 다양한 데이터를 저장하는 영역입니다.
클래스 로딩 과정이 완료되면 로드된 클래스에 대한 정보를 저장합니다.
주요 런타임 데이터 영역
- 메소드 영역
- 힙 영역
- 스택 영역
- PC 레지스터
- 네이티브 메소드 스택
힙 영역 Heap Area
자바 어플리케이션에서 동적으로 할당되는 데이터를 저장하는 영역입니다.
모든 자바 스레드가 공유하는 자원입니다.
자바 어플리케이션의 성능과 안전성에 직접적인 영향을 줄 수 있습니다.
메모리 사용량을 최적화할 수 있습니다.
응답 시간을 개선하고 시스템 안전성을 높일 수 있습니다.
객체가 생성될 때 메모리가 할당됩니다.
GC에 의해 사용하지 않는 메모리는 회수되는 동적 할당이 특징입니다.
구조
1) Young Generation
새롭게 생성된 객체들이 배치됩니다.
MinorGC와 같이 빠르게 생성하고 소멸합니다.
Eden 영역: 객체들이 처음 생성되어 할당되는 곳입니다.
Survivor 영역 S0
S1
:
Eden 영역에서 살아남은 객체들이 이동되는 곳입니다.
가비지 컬렉션 시 객체들이 이 두 영역 사이를 이동합니다.
2) Old Generation = Tenured Generation
Young Generation 에서 살아남은 객체들이 이동되는 곳입니다.
비교적 더 긴 생명주기를 가지고 있습니다.
메모리가 충분할 때까지 가비지 컬렉션에서 고려되지 않습니다.
3) Permanent Generation = PermGen
클래스 메타데이터, 메소드 메타데이터와 같이 JVM 메타데이터를 저장하는 영역입니다.
시스템 메모리에서 직접 관리하고 고정된 크기를 가집니다.
프로그램 시작 시 최대 크기를 지정할 수 있습니다.
고정된 크기때문에 JVM 시작 시 설정되는 크기로 동적으로 변화하는 메타데이터의 양에 유연하게 대응하기 어렵습니다.
클래스 로더가 제거되더라도 때때로 PermGen 내의 메타데이터가 제대로 회수되지 않아 메모리 누수가 발생할 수 있습니다.
Metaspace
java 8 부터 PermGen 영역을 대체할 수단으로 사용됩니다.
네이티브 메모리를 사용하여 힙의 외부에서 메타데이터를 관리합니다.
필요에 따라 동적으로 크기를 확장할 수 있습니다.메타데이터가 증가할 때마다 필요한 만큼 시스템 메모리를 추가로 할당할 수 있습니다.
네이티브 메모리를 사용함으로써 JVM의 힙 관리 부담이 감소하고 가비지 컬렉션의 효율이 개선될 수 있습니다.
클래스 로더가 제거될 때 관련 메타데이터도 쉽게 회수될 수 있도록 설계되어 메모리 누수 가능성을 줄일 수 있습니다.
동적 확장의 매커니즘
네이티브 메모리를 사용하여 힙 외부에 위치합니다.
JVM이 운영체제로부터 직접 메모리를 할당 받아 별개로 관리됩니다.
사용자는 시작 시 초기 크기, 최대 크기를 설정할 수 있으며 메모리 사용을 관리하는 데 도움이 됩니다.
메모리가 최대 크기에 도달하는 경우 더 이상 메모리를 할당받지 않습니다.
동적 할당 및 확장
클래스 메타 데이터 사용이 증가하면서 추가 메모리가 필요한 경우 JVM은 운영체제에 추가 메모리를 요청합니다.
운영체제의 메모리 관리자를 통해 필요한 만큼 메모리를 할당 받아 확장합니다.
'JVM' 카테고리의 다른 글
JVM_07_JVM 구성 요소_런타임 데이터 영역_PC 레지스터 (0) | 2024.05.08 |
---|---|
JVM_06_JVM 구성 요소_런타임 데이터 영역_스택 영역 (0) | 2024.05.08 |
JVM_04_JVM 구성 요소_런타임 데이터 영역 Runtime Data Area (0) | 2024.05.08 |
JVM_03_ JVM 구성 요소_실행 엔진 Execution Engine (0) | 2024.05.08 |
JVM_02_JVM 구성 요소_클래스 로더 Class Loader (0) | 2024.05.08 |