[JAVA] Garbage Collection
1. GC 개념
- Garbage Collection(가비지 컬렉션)
- 더이상 참조되지 않는 객체를 힙 메모리에서 제거하여 메모리를 확보하는 기능
- 메모리 누수 방지
2. 동작 방식
1) 시점
- 주기X, JVM 판단으로 실행
- 판단 근거
- 메모리 부족
- 시스템 idle(CPU 사용률이 낮은 상태)
- 객체 수 급증
- 판단 근거
- 명시적 호출이 가능하나 보장X
System.gc();
2) 제거 조건
- 참조 해제된 객체
- null값을 가진 객체
- 스코프를 벗어난 지역변수
✔︎ 객체 생존 기간에 따른 힙 메모리 구조
- JVM마다 GC 정책에 따라 다른 구조를 가짐
- HotSpot JVM(대부분의 자바 배포판) 메모리 구조
Heap ├─ Young Gen (Eden, Survivor0, Survivor1) │ └─ Minor GC └─ Old Gen └─ Major GC
- HotSpot JVM(대부분의 자바 배포판) 메모리 구조
(1) Young Generation
- 새로운 객체 생성 시 저장되는 메모리 구역
- Minor GC 활동 영역
- Minor GC: Young Gen에서만 수행
- GC 실행 빈도 多
- 생성 시점에 따라 세부적으로 구역 분리
- 오래될 수록 다음 영역으로 이동(메모리 주소 변경 가능)
(2) Old Generation
- Young Gen에서 승격(Promotion)된 객체 저장 메모리 구역
- Old Gen에 복사 & 참조 변수가 새 주소로 업데이트
- Major GC(Full GC)
- Major GC: 전 영역에 대해 수행
- GC 실행 빈도 少
- GC의 성능 부담이 큼
3) 실행 단계
(1) Stop The World
- JVM이 GC 전용 스레드 외 애플리케이션의 모든 스레드를 일시정지
- Heap 메모리를 안전하게 정리
(2) Mark and Sweep
- Mark: 참조되는 객체 식별
- Seep: 미참조 객체 제거 & 메모리 회수
4) GC 알고리즘
- JVM이 자동으로 선택: 실행 환경, Heap 크기, CPU 코어 수 등을 기반
- 사용자가 옵션으로 직접 지정 가능
- 알고리즘 종류
- Serial GC
- 단일 스레드 → 작은 Heap에서 Young/Old 영역 모두 수행
- Parallel GC
- 멀티 스레드 → Young Gen 병렬처리
- CMS (Concurrent Mark Sweep)
- Old Gen GC를 애플리케이션과 병행 수행 → Stop-The-World 최소화
- G1 GC
- Young/Old 병행 관리 → 대형 Heap 환경 최적화
- Serial GC
Leave a comment