hyeonga_code

JVM_05_JVM 구성 요소_Runtime Data Area_힙 영역 본문

JVM

JVM_05_JVM 구성 요소_Runtime Data Area_힙 영역

hyeonga 2024. 5. 8. 09:59
반응형

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은 운영체제에 추가 메모리를 요청합니다.
운영체제의 메모리 관리자를 통해 필요한 만큼 메모리를 할당 받아 확장합니다.

반응형