코드 그라데이션
Heap 영역에 대해 ++ 본문
Heap 영역의 관리
관리는 크게 세 가지 구조적인 부분으로 나눌 수 있다.
새로운 객체 할당
- 객체가 생성될 때, 힙 영역에 메모리 공간을 할당한다.
- 객체의 크기에 따라 동적으로 메모리를 할당하며, 할당된 메모리는 객체의 데이터와 함께 초기화된다.
객체 사용 및 참조
- 생성된 객체는 프로그램의 다른 부분에서 참조됩니다.
- 이때, 힙 영역 내부에는 객체의 주소를 참조하는 레퍼런스 변수들이 존재합니다.
- 여러 레퍼런스 변수가 동일한 객체를 참조할 수 있으며, 객체의 필드나 배열 요소 등을 통해 객체 내부의 데이터에 접근할 수 있습니다.
가비지 컬렉션 (Garbage Collection)
- 힙 영역에서는 더 이상 참조되지 않는 객체들이 가비지 컬렉션에 의해 정리된다.
- 가비지 컬렉터는 주기적으로 실행되거나 힙 영역이 꽉 찼을 때 동작하여 더 이상 참조되지 않는 객체를 식별하고 제거한다.
- 이렇게 해제된 메모리는 다시 새로운 객체가 할당될 때 사용될 수 있다.
힙 영역은 크게
- Young Generation
- Old Generation
- Permanent Generation (Java 7 이전) 또는 Metaspace (Java 8 이후) 의 세 부분으로 나뉠 수 있다.
Heap 영역의 구성요소
Young Generation (젊은 세대)
- Young Generation은 새로 생성된 객체들이 할당되는 공간이다.
- 이 영역에서는 Eden 영역과 두 개의 Survivor 영역(S0, S1)으로 나뉜다.
- 새로운 객체는 Eden 영역에 할당되며, 첫 번째 가비지 컬렉션 후 살아남은 객체는 하나의 Survivor 영역으로 이동한다.
- 계속해서 가비지 컬렉션이 발생하며, 살아남은 객체들은 계속해서 다른 Survivor 영역으로 이동하고, 일정 횟수 이상 살아남은 객체는 Old Generation으로 이동한다.
Old Generation (늙은 세대)
- Old Generation은 Young Generation에서 일정 기간 동안 살아남은 객체들이 이동하는 영역이다.
- Young Generation에서 가비지 컬렉션을 여러 차례 거친 객체 중 살아남은 객체들은 Old Generation으로 이동하게 됩니다.
- 이 영역은 상대적으로 큰 메모리 공간을 가지며, 오랜 시간 동안 살아남은 객체들이 저장됩니다.
- 주기적으로 가비지 컬렉션이 발생하여 Old Generation에서 더 이상 사용되지 않는 객체를 정리합니다.
Permanent Generation (Java 7 이전)
Permanent Generation은 클래스 메타데이터, 정적 변수(static variable), 상수 등의 정보를 저장하는 영역이었다.클래스로더에 의해 로드된 클래스와 관련된 정보들이 여기에 저장됐다.그러나 Permanent Generation의 크기가 고정되어 있어 클래스 로딩이나 어플리케이션의 동적인 특성에 대해 적응하기 어려웠고, 이로 인한 문제들이 존재했다
Metaspace (Java 8 이후)
- Java 8부터는 Permanent Generation이 Metaspace로 대체되었다.
- Metaspace는 힙 영역이 아니라 네이티브 메모리에 할당되며, 클래스 메타데이터와 관련된 정보를 저장한다.
- Metaspace는 동적으로 크기를 조절할 수 있어, Permanent Generation에서 발생했던 메모리 부족 문제 등을 해결했다.
- 클래스 로딩이나 어플리케이션의 동적 특성에 더 적응적으로 동작한다.
728x90
'백엔드 면접' 카테고리의 다른 글
APM과 부하 테스트 (0) | 2024.04.01 |
---|---|
GC와 JVM에 대해서 (0) | 2024.03.30 |
JVM Runtime data area + (0) | 2024.03.28 |
JVM 기본 구조(2) (0) | 2024.03.27 |
JVM 기본 구조 (1) (0) | 2024.03.27 |
Comments