가비지 컬렉터는 힙 메모리에서 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 역할을 한다. 프로그래머가 명시적으로 메모리를 해제하지 않아도 메모리 누수를 방지하고, 힙 메모리를 효율적으로 사용하도록 돕는 역할을 한다.
GC의 주요 동작 과정
1. 루트 탐색
GC는 사용중인 객체와 사용되지 않는 객체를 구분하기 위해 먼저 GC Roots에서부터 참조를 탐색한다.
GC Roots는 다음을 포함한다
- 스택에 저장된 지역 변수
- 현재 실행 중인 스레드의 참조
- 정적 변수
- 네이티브 코드에서의 참조
GC는 루트부터 시작하여 참조 그래프를 따라가며 도달 가능한 객체를 활성(Reachable) 객체로 표시한다
2. 참조 그래프 탐색
모든 GC Roots에서 시작하여 연결된 객체를 탐색하고 활성 객체로 마킹한다.
도달할 수 없는 객체는 가비지로 간주한다
3.메모리 정리
가비지로 확인된 객체를 힙에서 제거하고 메모리를 회수한다
메모리 해제 방식
- 해당 메모리 블록을 "비어있음"으로 표시
- 필요에 따라 메모리를 병합(프래그먼테이션 해소)
4. 힙메모리 관리
GC는 힙 메모리를 세대별로 나눠 관리하여 성능을 최적화 한다
세대별 가비지 수집
객체는 **생명 주기**에 따라 힙 메모리의 세대 영역으로 나뉜다.
- Young Generation
새로 생성된 객체가 저장된다
대부분의 객체는 짧은 생명 주기를 가지므로, Young 영역에서 빠르게 수집된다
Minor GC라고 한다 - Old Generation
Young 영역에서 살아남은 객체가 이동한다
장시간 사용되는 객체가 저장된다
Major GC 또는 Full GC라고 한다 - Permanent Generation
클래스 메타데이터를 저장하는 영역
Young Generation 내부 동작
1. Eden 영역
- 새로 성생된 객체는 처음에 Eden 영역에 할당된다
2. Minor GC 발생
- Eden이 가득 차면 Minor GC가 발생
- Eden에서 살아남은 객체는 Survivor 영역으로 이동
- GC루트에서 참조되지 않는 객체는 제거
3. Survivor 영역
- Survivor 영역의 객체가 일정 횟수의 GC를 지나면 Old 영역으로 이동한다
Old Generation 내부 동작
- Old 영역에서 GC가 발생하면 Major 또는 Full GC가 수행된다
- Young 영역보다는 느리지만, 힙의 대부분의 공간을 확보한다
'Java' 카테고리의 다른 글
[JAVA] 객체가 생성될 때 Stack과 Heap은 (0) | 2024.12.09 |
---|---|
JAVA Error & Exception (1) | 2024.12.02 |
JAVA 오토박싱 & 오토언박싱 (0) | 2024.12.02 |
JAVA 캐스팅 (0) | 2024.12.02 |
JAVA JVM(Java Virtual Machine) (1) | 2024.12.02 |