Garbage Collection
더 이상 사용하지 않는 객체를 청소하여 Heap 메모리 공간을 확보
하는 기능
GC는 weak generational hypothesis
라는 가설을 기반으로 만들어졌다고 합니다.
- 대부분 객체는 금방 접근 불가능한(unreachabel) 상태가 된다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생한다.
Heap 구조

Perm
Java 8 부터는 Metaspace로 변경
Young 영역(Minor GC발생)
- 새롭게 생성된 객체가 할당되는 영역
- 대부분의 객체가 금방 Unreachable상태가 되기 때문에, 많은 객체가 Young 영역에서 생성되었다가 사라짐
- Young 영역에 대한 GC를 Minor GC라 부름
Old 영역
- Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 GC는 적게 발생
- Old 영역에 대한 GC를 Major GC라 부름
동작 방식
GC는 아래 2가지 원리를 기반으로 동작합니다.
1. Stop The World
GC를 실행하는 thread 제외한 모든 thread의 작업을 중단 시키는 것
2. Mark and Sweep
- Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
- Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
Minor GC
Young 영역은 1개의 Eden
과 2개의 Survivor
영역으로 되어 있습니다.
- Eden : 새로 생성된 객체가 할당(Allocation)되는 영역
- Survivor : 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
순서
- 새로운 객체는 Eden에 할당
- Eden 영역이 꽉 차면 Minor GC 발생
- Eden 영역에서 사용되지 않는 메모리 해제
- 사용되는 객체는 Survivor 영역으로 이동
- 1~2번의 과정을 반복. Survivor 영역이 가득차면 다른 Survivor 영역으로 이동
- Survivor 영역 중 1개는 반드시 사용되어야 한다.
- 두 Survivor 영역에 모두 데이터가 존재하거나 모두 사용량이 0이면 시스템이 비정상적인 상황
- 위 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동(promotion)
- minor gc에서 살아남은 횟수를 의미하는 age를 object header에 기록
- age를 보고 promotion 여부를 결정
Major GC
객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생
References